在列表列表中计算赔率

时间:2016-04-09 21:50:35

标签: python python-3.x

在这样的列表列表中计算奇数的最短方法是什么,这个列表具有任意维度,不一定是5x5:

list_of_lists = [[1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5]]

我试过,但我猜它有更短的时间:

counter = 0
for row in list_of_lists:
    for i in row:
        if i % 2 != 0:
            counter += 1
print(counter)

2 个答案:

答案 0 :(得分:4)

如果你在主列表中总是有一个级别的平面列表,你可以使用内部循环来展平,对每个i % 2的结果求和,奇数为0,偶数为0:

list_of_lists = [[1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5]]

print(sum(i % 2 for sub in list_of_lists for i in sub))

或使用itertools.chain进行展平:

from itertools import chain

print(sum(i % 2 for i in  chain(*list_of_lists)))

如果您有任意嵌套,递归将是解决问题的简单方法:

def flat(lst):
    for i in lst:
        if isinstance(i, list):
            for j in flat(i):
                yield j % 2
        else:
            yield i % 2

print(sum(flat(list_of_lists)))

答案 1 :(得分:1)

计算对比度的numpy方式:

import numpy as np
list_of_lists = [[1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5],
                 [1, 2, 3, 4, 5]]

l = np.array(list_of_lists)
print len(l[l%2!=0])

l[l%2!=0]返回满足条件l%2!=0len()的所有元素。

PS:这当然假设list_of_lists是矩形的。对于每个内部列表允许不同长度的解决方案,请参阅Padraic的答案。