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 (if x % 2) entferne. 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?

191
ducin 26 Juni 2013 im 17:17

5 Antworten

Beste Antwort

x if y else z ist die Syntax für den Ausdruck, den Sie für jedes Element zurückgeben. Sie brauchen also:

[ x if x%2 else x*100 for x in range(1, 10) ]

Die Verwirrung ergibt sich aus der Tatsache, dass Sie im ersten Beispiel einen Filter verwenden, im zweiten jedoch nicht. Im zweiten Beispiel ordnen Sie jeden Wert nur einem anderen zu, indem Sie einen ternären Operatorausdruck verwenden.

Mit einem Filter benötigen Sie:

[ EXP for x in seq if COND ]

Ohne Filter benötigen Sie:

[ EXP for x in seq ]

Und in Ihrem zweiten Beispiel ist der Ausdruck ein "komplexer", der zufällig ein if-else beinhaltet.

305
Tim Pietzcker 18 Jän. 2014 im 13:01
[x if x % 2 else x * 100 for x in range(1, 10) ]
22
lucasg 26 Juni 2013 im 13:19

Nur eine andere Lösung, hoffe es könnte jemandem gefallen:

Verwenden von: [False, True] [Expression]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
10
James Sapam 18 Jän. 2014 im 12:54

Sie können dies auch mit Listenverständnis tun:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A
11
hev1 24 Juni 2019 im 14:37

Ich konnte das tun

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>
3
anudeep 11 Aug. 2016 im 08:43