2017-05-26 5 views
2

Ich habe eine Liste und muss eine Zählung erstellen, wie oft eine Bedingung erfüllt ist. Ist es mehr pythonic dies zu tun:Meiste Pythonic Condition Counter

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

oder ist das mehr pythonic:

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

Antwort

3

die Tatsache verwenden, daß True als eine ganze Zahl verwendet wird, ist 1:

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

Dies fügt eine Menge Overhead hinzu, wenn 'some_condition' nicht bereits eine Funktion ist, die Sie aufrufen müssen. – chepner

+1

kein Overhead, kann 'some_condition' irgendein Ausdruck sein, z.B. 's> 4', also kann es schneller sein als DeepSpace's Antwort. – Daniel

12

Weder noch.

Verwenden Sie das erste, aber ohne eine unnötige Liste im Speicher zu erstellen:

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

+0

sehr kühl; Ich kannte diese Art von Listenverständnis nicht, ohne die Liste zu erstellen. Wie heißt das? –

+0

@ Dr.Drew Generator Ausdruck: https://www.python.org/dev/peps/pep-0289/ – DeepSpace

+0

Sehr nette Antwort! – Konstantin

3

Sie können es einfach mehr:

cnt = sum(map(condition_func, a_list)) 

Das condition_func übernimmt, ist eine Art von Funktion, schaltet sich ein Element in der Liste in True oder False.

+2

Es ist wichtig zu beachten, dass, wenn 'condition_func' kein eingebautes ist, die Leistung von' map' schlechter sein kann als einige der anderen Alternativen. – DeepSpace

+0

@DeepSpace: Denkst du, map() wäre schlimmer als Daniels ansonsten äquivalente Antwort? –

+0

@DeepSpace könnten Sie ein wenig darauf eingehen? (oder geben Sie zumindest einen Hinweis). JohnZwinck - wirklich wie die Antwort (und tatsächlich verwenden diese Art von Dingen eine Menge), aber die Summierung "True" oder "False" Werte ist nicht sehr klar Muster (Ich habe eine Menge Fragen hier über SO in Bezug auf solche Dinge gesehen). – erhesto