不确定以前有人问过这个问题,但我找不到明显的答案。我正在尝试计算列表中等于某个值的元素数量。问题是这些元素不是内置类型。所以如果我有
class A:
def __init__(self, a, b):
self.a = a
self.b = b
stuff = []
for i in range(1,10):
stuff.append(A(i/2, i%2))
现在我想计算字段 b = 1 的列表元素。我想出了两个解决方案:
print [e.b for e in stuff].count(1)
和
print len([e for e in stuff if e.b == 1])
哪种方法最好?有更好的选择吗?似乎 count() 方法不接受 key (至少在 Python 2.5.1 版本中。
非常感谢!
最佳答案
sum(x.b == 1 for x in L)
bool 值(由 x.b == 1
等比较得出)也是 int
, 值为 0
对于 False
, 1
对于 True
,所以像求和这样的算术就可以了。
这是最简单的代码,但可能不是最快的(只有 timeit
可以肯定地告诉你;-)。考虑(简化的情况以很好地适应命令行,但等效):
$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'len([x for x in L if x==1])'
10000 loops, best of 3: 56.6 usec per loop
$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'sum(x==1 for x in L)'
10000 loops, best of 3: 87.7 usec per loop
因此,在这种情况下,生成一个额外的临时列表并检查其长度的“内存浪费”方法实际上比我更喜欢的更简单、更短、节省内存的方法要快得多。当然,列表值的其他组合、Python 实现、用于“投资”加速的内存可用性等,都会影响确切的性能。
关于python - Python中的条件计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764309/