2010-12-03 7 views
13

Mit Python möchte ich einen Test über eine ganze Liste ausführen, und, wenn alle Anweisungen für jedes Element in der Liste gelten, eine bestimmte Aktion ausführen.Wie mache ich eine "if-for" -Anweisung in Python?

Pseudocode: Wenn "test mit x" für jedes x in "list" gilt, dann "this".

Es scheint, als sollte es eine einfache Möglichkeit, dies zu tun.

Welche Syntax sollte ich in Python verwenden?

+0

Sie sollten eine Antwort akzeptieren. – Omnifarious

Antwort

28

Verwenden Sie all(). Es dauert ein iterable als ein Argument und gibt True zurück, wenn alle Einträge zu True ausgewertet werden. Beispiel:

if all((3, True, "abc")): 
    print "Yes!" 

Sie werden wahrscheinlich eine Art von Generator Ausdruck benötigen, wie

if all(x > 3 for x in lst): 
    do_stuff() 
+0

Perfekt! Vielen Dank! Verwenden Sie es, um einige Probleme des Projekts euler zu lösen. Den 10001. Prime zu finden, ist viel einfacher mit der All-Aussage! –

3
if reduce(lambda x, y: x and involve(y), yourlist, True): 
    certain_action() 

involve ist die Aktion, die Sie für jedes Element in der Liste einbinden wollen, yourlist ist Ihre ursprüngliche Liste , certain_action ist die Aktion, die Sie ausführen möchten, wenn alle Anweisungen wahr sind.

+0

Was ist "invovle"? Gibt es das in Python? –

+0

@Sven nur aus dem OP: "alle einbeziehen", "bestimmte_Aktion". – khachik

+0

Ah, ich verstehe. Danke, +1! –

3

Ich glaube, Sie wollen die all() Methode:

$ python 
>>> help(all) 
Help on built-in function all in module __builtin__: 

all(...) 
    all(iterable) -> bool 

    Return True if bool(x) is True for all values x in the iterable. 
4

Beispiel (Test alle Elemente sind größer als 0)

if all(x > 0 for x in list_of_xs): 
    do_something() 

Above ursprünglich eine Liste Verständnis verwendet (if all([x > 0 for x in list_of_xs]):), die wie erwähnt durch delnan (Danke) ein Generator-Ausdruck wäre schneller, da der Generator-Ausdruck bei der ersten False endet, während dieser Ausdruck den Vergleich auf alle Elemente der Liste anwendet.

jedoch mit Generator Ausdruck vorsichtig sein, wie:

all(x > 0 for x in list_of_xs) 

Wenn Sie pylab verwenden (Start ipython als ‚ipython -pylab‘), die alle Funktion mit numpy.all ersetzt, die nicht verarbeiten tut Generatorausdrücke richtig.

all([x>0 for x in [3,-1,5]]) ## False 
numpy.all([x>0 for x in [3,-1,5]]) ## False 
all(x>0 for x in [3,-1,5]) ## False 
numpy.all(x>0 for x in [3,-1,5]) ## True 
+3

Das sollte ein Generatorausdruck sein !! Da Generatoren die Werte on-demand berechnen, (1) verschwendest du keinen Speicher auf einer ganzen Liste und (2) du hast nie die Werte nach dem ersten Falsy berechnet, da 'all 'dort abbricht und den Generator nicht verbraucht noch weiter. – delnan

6
>>> x = [True, False, True, False] 
>>> all(x) 
False 

all() kehrt True, wenn alle Elemente in der Liste True

ähnlich sind, wird any() zurückkehren True wenn irgendein Element wahr ist.

0

all() allein funktioniert nicht gut, wenn Sie eine zusätzliche map() Phase benötigen.

siehe unten:

all((x==0 for x in xrange(1000)) 

und:

all([x==0 for x in xrange(1000)]) 

das zweite Beispiel wird 1000 durchführen zu vergleichen, auch die zweite vergleichen falsch das ganze Ergebnis machen.

Verwandte Themen