Python 在列表中计算赔率

Python 在列表中计算赔率,python,python-3.x,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_l

在任意维度(不一定是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)

如果主列表中始终有一级展开列表,则可以使用内部循环展开,将每个
i%2
的结果相加,奇数为1,偶数为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))
或用于进行展平:

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)))

对比度计数的基本方法:

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=0
len()


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

谢谢@Padraic Cunningham!回答得很好,速度也非常快:)事实上,对于列表的大小和数量,您的原始解决方案已经起作用了。@Zorgmorduk,如果列表中有列表,那么递归就是。。。