Eine List Comprehension baut eine Liste in einer einzigen Zeile. Sie ersetzt viele for-Schleifen mit append und gilt als typisch "pythonisch".
Die Grundform lautet [ausdruck for element in sammlung]:
quadrate = [x * x for x in range(1, 6)]
print(quadrate)
# Dasselbe mit einer Schleife:
quadrate2 = []
for x in range(1, 6):
quadrate2.append(x * x)
print(quadrate2 == quadrate)Ausgabe
[1, 4, 9, 16, 25] True
Mit Bedingung (Filter)
Ein if am Ende behält nur passende Elemente:
zahlen = range(1, 11)
gerade = [z for z in zahlen if z % 2 == 0]
print(gerade)
woerter = ["Apfel", "Ei", "Banane", "Os"]
lang = [w for w in woerter if len(w) > 2]
print(lang)Ausgabe
[2, 4, 6, 8, 10] ['Apfel', 'Banane']
Mit Umwandlung und Bedingung
Steht das if ... else vor dem for, entscheidet es über den Wert statt über das Behalten:
zahlen = [3, -1, 4, -5, 9]
print([z if z > 0 else 0 for z in zahlen])
print([w.upper() for w in ["a", "b", "c"]])
print([len(w) for w in ["Python", "ist", "toll"]])Ausgabe
[3, 0, 4, 0, 9] ['A', 'B', 'C'] [6, 3, 4]
Zwei Schleifen
paare = [(x, y) for x in [1, 2] for y in ["a", "b"]]
print(paare)
matrix = [[1, 2], [3, 4], [5, 6]]
flach = [wert for zeile in matrix for wert in zeile]
print(flach)Ausgabe
[(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')] [1, 2, 3, 4, 5, 6]
Dictionary- und Mengen-Comprehensions
Mit geschweiften Klammern entstehen Dictionaries und Mengen:
quadrat_von = {x: x * x for x in range(1, 5)}
print(quadrat_von)
laengen = {len(w) for w in ["Auto", "Haus", "Baum", "Tür"]}
print(laengen)
vertauscht = {v: k for k, v in {"a": 1, "b": 2}.items()}
print(vertauscht)Ausgabe
{1: 1, 2: 4, 3: 9, 4: 16}
{3, 4}
{1: 'a', 2: 'b'}Generator-Ausdrücke
Mit runden Klammern entsteht kein fertiges Ergebnis, sondern ein Generator, der Werte erst bei Bedarf liefert. Das spart Speicher bei großen Datenmengen:
summe = sum(x * x for x in range(1, 1001))
print(summe)Ausgabe
333833500
Übung
Übung mit Autokorrektur
Lies Wörter in einer Zeile ein. Erzeuge mit einer Comprehension die Liste der Wörter mit mehr als vier Buchstaben, in Großbuchstaben, und gib sie aus.
Merke
[ausdruck for x in sammlung if bedingung]ifam Ende filtert;wert1 if bed else wert2vor demforwählt Werte- Auch Dictionaries
{k: v for ...}und Mengen{x for ...}gibt es - Runde Klammern ergeben einen speichersparenden Generator
- Bei zu viel Logik lieber eine Schleife schreiben
Aufgabe
Erzeuge mit einer Comprehension eine Liste der Wörter aus ["Hund", "Katze", "Maus", "Elefant"], die länger als vier Buchstaben sind, in Großbuchstaben.