webentwicklung-frage-antwort-db.com.de

Einzeiliges Listenverständnis: If-else-Varianten

Es geht eher um python Listenverständnissyntax. Ich habe ein Listenverständnis, das eine Liste mit ungeraden Zahlen eines bestimmten Bereichs erzeugt:

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

Das macht einen Filter - ich habe eine Quellliste, in der ich gerade Zahlen entferne (if x % 2). Ich möchte hier etwas wie Wenn-Dann-Anderes verwenden. Folgender 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?

142
ducin

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

[ 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 ein Filter verwenden, im zweiten jedoch nicht. Im zweiten Beispiel ist nur Zuordnung jeder Wert mit einem Ternäroperator-Ausdruck einem anderen Wert zugeordnet.

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 deinem zweiten Beispiel ist der Ausdruck ein "komplexer", der zufällig ein if-else.

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

Nur eine andere Lösung, hoffe es gefällt jemandem:

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

Das können Sie auch mit Listenverständnis machen:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A
10

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]
>>>
2
anudeep