假设我有一个MyClass
列表。我想计算将MyClass.SomeProperty
设置为True
的元素数(假设SomeProperty
是始终True
或False
的布尔值)我担心的是:
它应该跑得很快
代码不应该让人看不懂
它应该适用于任何类型的情况(不仅仅是布尔人)
我知道我能做到:
count = len([e for e in MyList if e.SomeProperty]) # For non booleans, something like e.SomeProperty == MyValue
但似乎效率不高。
为什么要输入一个无意义的东西,比如
e for e
?当你只想数数的时候,为什么要创建一个完整的列表呢?
有可能做得更好吗?
最佳答案
可以对生成器表达式使用sum
。
count = sum( e.SomeProperty for e in MyList )
或者对于一般谓词:
count = sum( p(e) for e in MyList )
这使得使用事实true和false可以用作整数1和0,并且使用生成器将阻止创建新列表。
如果您坚持避免
p
部分,您可以使用for e in
和map
:import opertor
count = sum(map(operator.attrgetter('SomeProperty'), MyList))
或者对于一般谓词:
count = sum(map(p, MyList))
不过,这是少蟒蛇。我推荐第一种方法。