2017-05-26 35 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