692 Stimmen

If else in a list comprehension

Ich habe eine Liste l:

l = [22, 13, 45, 50, 98, 69, 43, 44, 1]

Für Zahlen über 45 einschließlich möchte ich 1 hinzufügen; und für Zahlen darunter 5.

Ich habe versucht

[x+1 for x in l if x >= 45 else x+5]

Aber es gibt mir einen Syntaxfehler. Wie kann ich so etwas wie ein ifelse in einer Listenverständnis erreichen?

819voto

user225312 Punkte 117771
>>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
>>> [x+1 if x >= 45 else x+5 for x in l]
[27, 18, 46, 51, 99, 70, 48, 49, 6]

Mache-etwas wenn , sonst mache-etwas-anderes.

356voto

arboc7 Punkte 5484

Der Grund, warum dieser Fehler auftritt, hat damit zu tun, wie die Listenabstraktion durchgeführt wird.

Denken Sie daran:

[ Ausdruck for Element in Liste if Bedingung ]

Entspricht:

for Element in Liste:
    if Bedingung:
        Ausdruck

Der Ausdruck ist dabei in einem etwas anderen Format (denken Sie daran, die Reihenfolge von Subjekt und Verb in einem Satz zu ändern).

Daher macht Ihr Code [x+1 for x in l if x >= 45] dies:

for x in l:
    if x >= 45:
        x+1

Jedoch macht dieser Code [x+1 if x >= 45 else x+5 for x in l] dies (nach Umstellung des Ausdrucks):

for x in l:
    if x>=45: x+1
    else: x+5

308voto

Dan D. Punkte 70371
[x+1 if x >= 45 else x+5 for x in l]

Und als Belohnung hier ist der Kommentar, den ich geschrieben habe, um mich an diesen Fehler das erste Mal zu erinnern:

Die bedingte Ausdrucksform in Python ist a if C else b und kann nicht verwendet werden wie:

[a for i in items if C else b]

Die richtige Form ist:

[a if C else b for i in items]

Auch wenn es eine gültige Form gibt:

[a for i in items if C]

Aber das ist nicht dasselbe, denn so filtert man nach C, aber sie können kombiniert werden:

[a if tC else b for i in items if fC]

148voto

AndiDog Punkte 65445

Sie müssen den Ausdruck am Anfang der Listenabstraktion platzieren, eine if-Anweisung am Ende filtert Elemente!

[x+1 if x >= 45 else x+5 for x in l]

41voto

Xiaojun Chen Punkte 1134

Wie bei [a if condition1 else b for i in list1 if condition2] haben die beiden if-Bedingungen mit condition1 und condition2 unterschiedliche Aufgaben. Der Teil (a if condition1 else b) stammt aus einem Lambda-Ausdruck:

lambda x: a if condition1 else b

während die andere condition2 ein weiteres Lambda ist:

lambda x: condition2

Die gesamte Listenkomprehension kann als Kombination von map und filter betrachtet werden:

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X