Es geht mehr um die Syntax des Python-Listenverständnisses. Ich habe ein Listenverständnis, das eine Liste ungerader Zahlen eines bestimmten Bereichs erzeugt:
[x for x in range(1, 10) if x % 2]
Dies macht einen Filter - ich habe eine Quellenliste, in der ich gerade Zahlen entferne ( if x % 2
). Ich würde hier gerne so etwas wie Wenn-Dann-Sonst verwenden. Der folgende Code schlägt fehl:
>>> [x for x in range(1, 10) if x % 2 else x * 100]
File "<stdin>", line 1
[x for x in range(1, 10) if x % 2 else x * 100]
^
SyntaxError: invalid syntax
Es gibt einen Python-Ausdruck wie if-else:
1 if 0 is 0 else 3
Wie verwende ich es in einem Listenverständnis?
()
anstelle von verwenden[]
.if x % 2
eliminiert gerade Zahlen (statt sie zu halten) - es ist da , wennx
sogar diex % 2
Expression zu0
, was wiederum wertet aufFalse
, während jedeint
Ausnahme0
auswertet zuTrue
.Antworten:
x if y else z
ist die Syntax für den Ausdruck, den Sie für jedes Element zurückgeben. Sie brauchen also:Die Verwirrung ergibt sich aus der Tatsache, dass Sie im ersten Beispiel einen Filter verwenden, im zweiten jedoch nicht. Im zweiten Beispiel sind Sie nur abbildet , jeden Wert zu einem anderen, einen ternären-Operator Ausdruck.
Mit einem Filter benötigen Sie:
Ohne Filter benötigen Sie:
und in Ihrem zweiten Beispiel ist der Ausdruck ein "komplexer", der zufällig einen beinhaltet
if-else
.quelle
[x for x in range(1, 10) if x % 2]
ist die richtige Syntax.[x if x % 2 for x in range(1, 10)]
- Dies ist keine[x if x%2 else x*100 for x in range(1, 10)]
korrekte Syntax , aber auch hier. Woher?else
) noch ein Filter (da erEXP
Teil des Listenverständnisses ist)if
am Ende eine Sekunde hinzufügen können :[x if x%2 else x*100 for x in range(1, 10) if not x%3]
Die ersteif
ist Teil des ternären Operators, die zweiteif
ist Teil der Listenverständnis-Syntax. Das Ganzex if x%2 else x*100
ist "auf der gleichen Ebene" wie ein einfaches2*x
, es ist der Ausdruck, der auf der linken Seite des zu bewerten istfor
, wenn die Filterung vonif not x%3
bereits stattgefunden hat.for i in x:
und dann in der for-Schleife zu erstellenif i == y:
?quelle
Sie können dies auch mit Listenverständnis tun:
quelle
Nur eine andere Lösung, hoffe es könnte jemandem gefallen:
Verwenden von: [False, True] [Expression]
quelle
Ich konnte das tun
quelle