假设我有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
有可能做得更好吗?
答案 0 :(得分:4)
您可以将sum
与生成器表达式一起使用。
count = sum( e.SomeProperty for e in MyList )
或者对于一般谓词p
:
count = sum( p(e) for e in MyList )
这样可以使用True和False作为整数1和0的事实,并且使用生成器这一事实将阻止创建新列表。
如果您坚持要避开for e in
部分,可以使用map
和attrgetter
:
import opertor
count = sum(map(operator.attrgetter('SomeProperty'), MyList))
或者对于一般谓词p
:
count = sum(map(p, MyList))
然而,这不是pythonic。我推荐第一种方法。
答案 1 :(得分:0)
当然你的意思是:
count = sum(bool(e.SomeProperty) for e in MyList)
答案 2 :(得分:0)
与其他人类似,但更多的是Pythonic imho:
sum(1 for e in MyList if e.SomeProperty)
或者如果你不在乎懒惰:
len([e for e in MyList if e.SomeProperty])