Python 最短的计数方法?

Python 最短的计数方法?,python,count,list-comprehension,Python,Count,List Comprehension,假设我有一个MyClass的列表。我想计算MyClass.SomeProperty设置为True的元素数(假设SomeProperty是一个布尔值,总是True或False)。我关注的是: 它应该跑得快 代码不应该让人读起来混淆 它应该适用于任何类型的条件(不仅仅是布尔值) 我知道我能做到: count = len([e for e in MyList if e.SomeProperty]) # For non booleans, something like e.SomeProperty

假设我有一个
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代替e
  • 当你只想数一数的时候,为什么还要创建一个完整的列表呢

有可能做得更好吗?

您可以将
sum
与生成器表达式一起使用

count = sum( e.SomeProperty for e in MyList )
或者对于一般谓词
p

count = sum( p(e) for e in MyList )
count = sum(map(p, MyList))
这使得事实True和False可以用作整数1和0,而事实上使用生成器将阻止创建新列表

如果您坚持在部分中避免使用e的
,您可以使用
map
和:

或者对于一般谓词
p

count = sum( p(e) for e in MyList )
count = sum(map(p, MyList))
然而,这并不是一种蟒蛇式的行为。我推荐第一种方法。

你的意思是:

count = sum(bool(e.SomeProperty) for e in MyList)

与其他类似,但略为类似于Python的imho:

sum(1 for e in MyList if e.SomeProperty)
或者如果你不在乎懒惰:

len([e for e in MyList if e.SomeProperty])

我知道我能做到-不,那不行。你可以用for循环代替理解:if e.SomeProperty:DO SOMETHING
@vaultah为什么?我刚刚试过
x=[1,2,3,4,5,6,7];len([i表示x中的i,如果i%2==0])
并且它给出了正确的结果。与
x=[True,True,True,False,False,False]相同;len([i for i in x if i])
@Superbest:您问题中的代码没有括号。“它应该适用于任何类型的条件(不仅仅是布尔值)”我们不能采用True计算为1,False计算为0的快捷方式。@Shashank我阐明了如何将这两种方法应用于任何类型的条件。