2016-05-24 4 views
2

Ich versuche, eine bestimmte Liste gegen sehr sehr spezifische Regeln zu überprüfen. In diesem speziellen Beispiel habe ich eine Liste von Exit-Codes und möchte prüfen, ob der Test fehlgeschlagen ist. Der Test schlägt fehl, wenn auch nur eine des Exit-Codes ist nicht 0.Wie überprüfe ich 'if-Bedingung' für jedes Element in einer Liste

Meine aktuelle Implementierung:

for exit_code in result_list: 
    if exit_code is not 0: 
     raise TestFailed 

Frage: ist es möglich, die ersten beiden Zeilen in einem stopfen? Ist es vorzuziehen, dies zu tun?

+1

IMHO ist mit 'any' nicht Ihr Code besser lesbar macht. Ich empfehle persönlich, die implizite Konvertierung von 'int' nach' bool' nicht zu verwenden, da dies den Code weniger lesbar macht. Ich bevorzuge explizitheit. Der einzige Vorteil von 'any' könnte eine bessere Leistung sein, da sich die Schleife innerhalb der Bibliotheksfunktion befindet. Dies ist jedoch wahrscheinlich eine vorzeitige Optimierung und/oder nicht Ihr Leistungsengpass. – Markus

Antwort

4

Sie auch any oder all wie diese verwenden:

>>> any(exit_code !=0 for exit_code in result_list) 
True 
>>> all(exit_code==0 for exit_code in result_list) 
False 

seit 1 wahr ist und 0 ist falsch in Python.

any(result_list) versuchen, eventuell vorhandene 1-Element zu finden, die nicht 0 (True)

+1

Als richtige Antwort für nicht nur geben die richtige Lösung, sondern geben zwei ähnliche Methoden, die ich nicht vertraut war. Sowie erklären, was jede Funktion zurückgibt. –

+0

mit 'all (result_list)' ist hier falsch. Sie MÜSSEN die Elemente negieren, bevor Sie an alle übergeben werden. 'error_found = nicht alles (nicht ich für i in result_list)'. Die Negation der Liste vor der Übergabe an 'all 'kann nicht weggelassen werden. – Markus

+0

@Markus mit 'all' hier ist ein wenig riskant, da es nicht alle Fälle passieren wird. Zum Beispiel: '[0, 0, 1, 0, 0]' -> 'not all()' würde 'True' ergeben, Ihr Code würde auch' True' ergeben, wir können 'all' hier nicht verwenden. Bitte entfernen Sie die Down-Abstimmung. – ritesht93

5

können Sie any verwenden:

if any(exit_code != 0 for exit_code in result_list): 
    raise TestFailed 

Beachten Sie, dass das oben beschriebene Verfahren geht davon aus, dass Sie auch für Werte werden überprüft, die äquivalent sind False boolean (wie None oder False!). Wenn Sie sicher sind, dass Ihre result_list nur Zahlen enthält, können Sie es verkürzen, ein wenig mehr:

if any(result_list): 
    raise TestFailed 
+0

Ich habe @ ritesht93's Antwort als die richtige markiert, aber auch diese Antwort aufgewertet, da sie eine sehr schöne Erklärung enthält, wie dies zu implementieren ist. Ich mochte die zweite, kürzere Implementierung sehr. So ordentlich! –

Verwandte Themen