Python List Comprehension funktioniert nicht?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
liste = (x*2 for x in (1, 2, 3, 4, 5))

Das ist keine List Comprehension. Das ist eine Generator Expression. Die liefert einen Generator: ein Objekt, das auf Anfrage einen Wert nach dem anderen liefert. Damit kann man z.B. eine Liste befüllen, aber es ist selbst eben keine Liste.

Was tun? Der Konstruktor list() tut genau das, er nimmt sich aus dem übergebenen iterierbaren Objekt (ein Generator ist sowas) einen Wert nach dem anderen und baut daraus eine Liste. Das können wir also probieren:

liste = list((x*2 for x in (1, 2, 3, 4, 5)))

Aber schöner ist doch, gleich eine richtige List Comprehension zu verwenden. Der Unterschied ist einfach der Klammertyp:

liste = [x*2 for x in (1, 2, 3, 4, 5)]

Weil das keine List Comprehension ist, sondern ein Generator-Ausdruck.

liste = [x*2 for x in (1, 2, 3, 4, 5)]
print(liste)

Was du hier verwendest, ist keine Liste im klassischen Sinne, sondern ein Generator-Ausdruck (generator expression). Generatoren in Python sind eine Möglichkeit, iterierbare Reihen von Elementen zu erstellen, ohne gleichzeitig alle Elemente im Speicher halten zu müssen. Die Elemente werden "on-the-fly" generiert, wenn sie benötigt werden.

Das bedeutet, dass der Generator-Ausdruck

x*2 for x in (1, 2, 3, 4, 5)

keine Liste der verdoppelten Zahlen erstellt, sondern eine Anleitung, wie man die verdoppelten Zahlen erhält, wenn man sie durchläuft.

Um alle Elemente zu sehen, kannst du den Generator in eine Liste umwandeln:

python

Copy code
liste = (x*2 for x in (1, 2, 3, 4, 5)) print(list(liste))

Das gibt

[2, 4, 6, 8, 10]

aus.

Beachte, dass ein Generator "einweg" ist. Das bedeutet, dass du ihn nur einmal durchlaufen kannst. Danach ist der Generator "erschöpft", und du müsstest ihn neu erzeugen, um die Elemente nochmals zu erhalten.