2010-11-23 10 views
467

Wie kann ich Folgendes in Python tun?if/else in Pythons Listenverständnis?

row = [unicode(x.strip()) for x in row if x is not None else ''] 

Im Wesentlichen:

  1. ersetzen alle Nones mit leeren Saiten, und dann
  2. eine Funktion auszuführen.
+3

möglich Duplikat [? Ist es möglich, ‚sonst‘ in einem Python-Liste Verständnis zu verwenden] (http://stackoverflow.com/questions/2951701/is-it- potential-to-use-else-in-a-python-list-Verständnis) –

Antwort

734

Sie können völlig tun, es ist nur eine Bestell Ausgabe:

[ unicode(x.strip()) if x is not None else '' for x in row ] 

Beachten Sie, dass dies tatsächlich ein anderes Sprachkonstrukt verwendet, ein conditional expression, die sich nicht Teil der comprehension syntax sind, während die if nach der for…in ist Teil der Liste Comprehensions und verwendet Filter Elemente aus der Quelle iterierbar.

Bedingte Ausdrücke können in allen Situationen verwendet werden, in denen Sie basierend auf einer Bedingung zwischen zwei Ausdruckswerten wählen möchten. Dies entspricht dem ternary operator ?: that exists in other languages. Zum Beispiel:

value = 123 
print(value, 'is', 'even' if value % 2 == 0 else 'odd') 
+86

Beachten Sie, dass das if/else hier jetzt "ternary operator" -Syntax und nicht Listenverständnissyntax ist. –

+1

Angesichts der vorherigen Frage von OP ist @ Adams Bemerkung sehr wichtig! – delnan

+7

Deshalb ziehe ich es vor, den ternären Operator in Klammern zu setzen, es macht deutlicher, dass es nur ein normaler Ausdruck ist, kein Verständnis. –

30

One way:

def change(f): 
    if f is None: 
     return unicode(f.strip()) 
    else: 
     return '' 

row = [change(x) for x in row] 

Obwohl dann Sie haben:

row = map(change, row) 

Oder Sie können einen Lambda-Inline verwenden.

+8

Dies ist auch eine gute (vielleicht nur) Technik, die verwendet werden muss, wenn Sie mögliche Ausnahmen von dem 'if'-Ausdruck oder -Code in seinem oder dem' else's-Anweisungsblock behandeln müssen. Die angenommene Antwort ist besser für einfache Fälle. – martineau

+1

Dies ist viel einfacher zu lesen als in einem Listenverständnis zu verwenden. –

25

Hier ist ein weiteres erläuterndes Beispiel:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!") 
Ha, ha, ha! 

Es nutzt die Tatsache, dass if irange() von der Funktion erzeugt für 0 und True für alle anderen Werte auf False auswertet. Deshalb ist die Liste Verständnis bewertet wie folgt:

>>> ["ha" if i else "Ha" for i in range(3)] 
['Ha', 'ha', 'ha']