2017-05-26 58 views
2

我有一个列表,并需要创建一个条件满足的次数的计数。难道是更Python做到这一点:最Pythonic条件计数器

cnt = sum([1 for s in a_list if some_condition]) 

,或者这是更Python:

cnt = 0 
    for s in a_list: 
    if (some_condition): 
     cnt += 1 

回答

3

使用事实上,用作整数True1

cnt = sum(some_condition(s) for s in a_list) 
+0

如果'some_condition'还不是您需要调用的函数,则会增加很多开销。 – chepner

+1

无开销,'some_condition'可以是任何表达式,例如's> 4',所以它可以比DeepSpace的答案更快。 – Daniel

12

都不是。

使用第一个,但没有在内存中创建一个不必要的名单:

cnt = sum(1 for s in a_list if some_condition)

+0

非常凉;我不知道这种类型的列表理解功能,而没有实际创建列表。这个叫什么? –

+0

@ Dr.Drew生成器表达式:https://www.python.org/dev/peps/pep-0289/ – DeepSpace

+0

非常好的答案! – Konstantin

3

您可以更简单地做到这一点:

cnt = sum(map(condition_func, a_list)) 

即假定condition_func是某种功能开启列表中的项目变为True或False。

+2

需要注意的是,如果'condition_func'不是内置的,那么'map'的性能可能会比其他一些替代品的性能更差。 – DeepSpace

+0

@DeepSpace:你认为'map()'会比Daniel的等价答案更糟吗? –

+0

@DeepSpace你能详细解释一下吗? (或者至少给一些参考)。 JohnZwinck - 真的很喜欢答案(并且实际上使用这种类型的东西很多),但总结“真”或“假”值并不是非常清晰的模式(我在这里看到过很多关于这种事情的问题)。 – erhesto