假设我有一个MyClass列表。我想计算将MyClass.SomeProperty设置为True的元素数(假设SomeProperty是始终TrueFalse的布尔值)我担心的是:
它应该跑得很快
代码不应该让人看不懂
它应该适用于任何类型的情况(不仅仅是布尔人)
我知道我能做到:

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 inmap
import opertor
count = sum(map(operator.attrgetter('SomeProperty'), MyList))

或者对于一般谓词:
count = sum(map(p, MyList))

不过,这是少蟒蛇。我推荐第一种方法。

10-06 01:45