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我阐明了如何将这两种方法应用于任何类型的条件。