Zum Inhalt springen
aviral gupta

// B4.2 · ca. 25 Min. · Einstieg

List Comprehensions

Nach dieser Lektion machen Sie aus einer Schleife, die eine Liste aufbaut, eine Comprehension, lesen Comprehensions mit zwei for-Klauseln oder ineinander geschachtelt und entfernen Elemente mit del.

Lektion 2 von 6 in B4 Datenstrukturen

Danach können Sie

  • Eine List Comprehension mit if-Filter statt einer Schleife mit append schreiben
  • Comprehensions mit zwei for-Klauseln und ineinander geschachtelte Comprehensions lesen
  • Elemente mit del nach Position oder Slice entfernen und del von pop() und remove() unterscheiden
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus Lektion B4.1: nums = [3, 1, 2]. Welche dieser Aufrufe geben None zurück? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es vorher, bevor Sie weiterlesen: Was gibt das aus?

    print([x * x for x in range(5) if x % 2 == 0])
  3. Üben · Aufgabe 3 von 7

    Setzen Sie das Schlüsselwort ein, das nur die geraden Zahlen behält.

    nums = [4, 7, 10, 13]
    evens = [n for n in nums ____ n % 2 == 0]
    evens = [n for n in nums n % 2 == 0]
  4. Üben · Aufgabe 4 von 7

    Zwei for-Klauseln. Was gibt das aus?

    print([x + y for x in "ab" for y in "12"])
  5. Üben · Aufgabe 5 von 7

    Bringen Sie die Zeilen in die richtige Reihenfolge, um dieselbe Liste wie diese Comprehension mit einer for-Schleife zu bauen.

    result = [w.upper() for w in words if w]
    1. 1. result.append(w.upper())
    2. 2. if w:
    3. 3.result = []
    4. 4.for w in words:
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Beide Comprehensions verwenden if. Was gibt das aus?

    nums = [3, -1, 2]
    print([x if x > 0 else 0 for x in nums], [x for x in nums if x > 0])
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Schreiben Sie flatten(matrix), das alle Werte einer Liste von Listen in einer flachen Liste liefert, und transpose(matrix), das Zeilen zu Spalten macht. Verwenden Sie in jeder Funktion eine Comprehension. Für [[1, 2, 3], [4, 5, 6]] sollten [1, 2, 3, 4, 5, 6] und [[1, 4], [2, 5], [3, 6]] herauskommen.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Umfrageantworten bereinigen

Eine Umfrage hat Freitextantworten mit überzähligen Leerzeichen, Großbuchstaben und leeren Einträgen gesammelt. Eine Comprehension bereinigt sie und verwirft die leeren: strip() entfernt Leerzeichen an beiden Enden, lower() macht alles klein. Eine zweite behält nur die Ja-Antworten. Dann baut eine Comprehension in einer Comprehension ein kleines Einmaleins, und del entfernt Antworten nach Position und nach Slice. Ändern Sie die Antworten und starten Sie erneut.

main.py

answers = ["  Yes", "no ", "", "YES", " maybe", "No"]

# Tidy every answer and drop the empty ones.
cleaned = [a.strip().lower() for a in answers if a.strip()]
print("Cleaned:", cleaned)

yes_votes = [a for a in cleaned if a == "yes"]
print("Yes votes:", len(yes_votes))

# A comprehension inside a comprehension: one inner list per row.
table = [[row * col for col in range(1, 4)] for row in range(1, 4)]
print("Table:", table)

# del removes by position or by slice, and returns nothing.
del cleaned[0]
print("Without the first:", cleaned)
del cleaned[1:3]
print("Without two more:", cleaned)

Ausführen mit

python main.py

Ausgabe

Cleaned: ['yes', 'no', 'yes', 'maybe', 'no']
Yes votes: 2
Table: [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
Without the first: ['no', 'yes', 'maybe', 'no']
Without two more: ['no', 'no']
  • Der Filter a.strip() verwirft "", denn ein leerer String ist falsch.
  • Die Tabelle hat eine innere Liste pro Zeile: Die äußere Comprehension führt die innere dreimal aus.
  • del cleaned[1:3] hat die Elemente an den Positionen 1 und 2 entfernt, nicht 3.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Lange Wörter hervorheben

shout_long(words, min_len) soll in Großbuchstaben und in ursprünglicher Reihenfolge nur die Wörter liefern, die mindestens min_len Buchstaben haben. Der Startcode schreibt jedes Wort groß. Ergänzen Sie den Filter; es bleibt bei einer einzigen List Comprehension.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Ein Filter steht am Ende der Comprehension: … for w in words if bedingung.

  2. Hinweis 2

    len(w) liefert die Anzahl der Buchstaben. „Mindestens“ heißt >=.

  3. Hinweis 3

    return [w.upper() for w in words if len(w) >= min_len]

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

def shout_long(words: list[str], min_len: int) -> list[str]:
    """Return the words with at least min_len letters, in capitals."""
    return [w.upper() for w in words if len(w) >= min_len]
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

def shout_long(words: list[str], min_len: int) -> list[str]:
    """Return the words with at least min_len letters, in capitals."""
    return [w.upper() for w in words]

test_main.py

from main import shout_long


def test_filters_short_words():
    """Behält nur Wörter mit mindestens min_len Buchstaben, in Großbuchstaben"""
    got = shout_long(["hi", "hello", "hey", "world"], 4)
    assert got == ["HELLO", "WORLD"], f"shout_long([...], 4) lieferte {got!r}, erwartet: ['HELLO', 'WORLD']"


def test_boundary():
    """Ein Wort mit genau min_len Buchstaben bleibt"""
    got = shout_long(["tea", "to"], 3)
    assert got == ["TEA"], f"shout_long(['tea', 'to'], 3) lieferte {got!r}, erwartet: ['TEA']"


def test_empty():
    """Eine leere Liste ergibt eine leere Liste"""
    got = shout_long([], 2)
    assert got == [], f"shout_long([], 2) lieferte {got!r}, erwartet: []"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Übung 2 von 2

Sitzplatznummern

seat_labels(rows, cols) soll für jede Reihe eines Theaters eine Liste liefern: A1, A2, … für die erste Reihe, B1, B2, … für die zweite und so weiter. seat_labels(2, 3) ergibt [["A1", "A2", "A3"], ["B1", "B2", "B3"]]. Der Startcode verwendet zwei for-Klauseln und erhält eine flache Liste. Schreiben Sie ihn als Comprehension in einer Comprehension.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser Python herunter (bis zu 6.5 MB) und speichert es im Cache. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Die innere Comprehension baut eine Reihe: [letter + str(number) for number in range(1, cols + 1)].

  2. Hinweis 2

    Die äußere führt die innere einmal pro Buchstabe in "ABCDEFGHIJ"[:rows] aus.

  3. Hinweis 3

    return [[letter + str(number) for number in range(1, cols + 1)] for letter in "ABCDEFGHIJ"[:rows]]

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

def seat_labels(rows: int, cols: int) -> list[list[str]]:
    """Return one list of seat labels per row: A1, A2, ... then B1, B2, ..."""
    return [[letter + str(number) for number in range(1, cols + 1)] for letter in "ABCDEFGHIJ"[:rows]]
Auf dem eigenen Computer ausführen

Installieren Sie Python 3.14 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.py

def seat_labels(rows: int, cols: int) -> list[list[str]]:
    """Return one list of seat labels per row: A1, A2, ... then B1, B2, ..."""
    # This builds one flat list. Build one inner list per row instead.
    return [letter + str(number) for letter in "ABCDEFGHIJ"[:rows] for number in range(1, cols + 1)]

test_main.py

from main import seat_labels


def test_two_rows():
    """Zwei Reihen mit je drei Plätzen"""
    got = seat_labels(2, 3)
    assert got == [["A1", "A2", "A3"], ["B1", "B2", "B3"]], f"seat_labels(2, 3) lieferte {got!r}"


def test_single_seat():
    """Eine Reihe mit einem Platz ist [['A1']]"""
    got = seat_labels(1, 1)
    assert got == [["A1"]], f"seat_labels(1, 1) lieferte {got!r}, erwartet: [['A1']]"


def test_third_row():
    """Die dritte Reihe beginnt mit C"""
    got = seat_labels(3, 2)
    assert len(got) == 3 and got[2] == ["C1", "C2"], f"seat_labels(3, 2) lieferte {got!r}; die dritte Reihe sollte ['C1', 'C2'] sein"

Unter macOS und Linux tippen Sie python3, wo in diesen Befehlen python steht, wie in der ersten Lektion.

Programm ausführen:

python main.py

Prüfungen ausführen (learnrun.py muss im selben Ordner liegen):

python learnrun.py test
learnrun.py herunterladen

Häufige Fehler

Ein Tupel ohne Klammern

pairs = [x, x * 2 for x in range(3)]

Was Python ausgibt

SyntaxError: did you forget parentheses around the comprehension target?

Warum, und die Lösung

Ist der Ausdruck vorne ein Tupel, muss er in Klammern stehen: [(x, x * 2) for x in range(3)]. Ohne sie erkennt Python nicht, wo der Ausdruck endet, und die Meldung schlägt die Lösung schon vor.

if vorne ohne else

nums = [3, -1, 2]
print([x if x > 0 for x in nums])

Was Python ausgibt

SyntaxError: expected 'else' after 'if' expression

Warum, und die Lösung

Ein if vor dem for ist ein bedingter Ausdruck und muss für beide Fälle einen Wert angeben: [x if x > 0 else 0 for x in nums]. Wollen Sie Elemente verwerfen, gehört das if ans Ende: [x for x in nums if x > 0].

del hinter dem Listenende

names = ["ana", "ben"]
del names[2]

Was Python ausgibt

IndexError: list assignment index out of range

Warum, und die Lösung

names hat die Positionen 0 und 1, an Position 2 gibt es nichts. Prüfen Sie vorher die Länge oder nehmen Sie del names[-1] für das letzte Element. Ein Slice ist nachsichtig: del names[2:] entfernt nichts und löst keinen Fehler aus.

Python im Browser: Pyodide 314.0.7, MPL-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Eine Schleife in einem Ausdruck

[ausdruck for item in sequenz if bedingung] baut eine neue Liste: Für jedes Element kommt, wenn die Bedingung wahr ist, der Wert des Ausdrucks hinein. Das leistet dasselbe wie eine leere Liste, eine Schleife und append, aber in einer lesbaren Zeile. Die Schleifenvariable gehört der Comprehension; anders als bei einer for-Schleife überschreibt sie keine gleichnamige Variable außerhalb. Das if am Ende filtert. Um zwischen zwei Werten zu wählen, steht vorne ein bedingter Ausdruck: [x if x > 0 else 0 for x in nums].

Zwei for-Klauseln oder eine Comprehension in der anderen

Eine Comprehension kann mehrere for-Klauseln haben. Sie laufen in der geschriebenen Reihenfolge, wie verschachtelte Schleifen: [v for row in grid for v in row] heißt „für jede Zeile, für jedes v darin“ und ergibt eine flache Liste. Eine Comprehension kann auch der Ausdruck einer anderen sein: [[r * c for c in range(3)] for r in range(3)] baut für jedes r eine innere Liste, das Ergebnis ist also eine Liste von Listen. Ist der Ausdruck ein Tupel, braucht er Klammern.

del entfernt nach Position

del a[i] entfernt das Element an Position i; del a[i:j] entfernt einen Slice; del a[:] leert die Liste, die dabei dasselbe Listenobjekt bleibt. del ist eine Anweisung, keine Methode, und liefert nichts: result = del a[0] ist ein SyntaxError. Nehmen Sie pop(i), wenn Sie den entfernten Wert brauchen, und remove(x), wenn Sie den Wert kennen, aber nicht seine Position. del name löscht die Variable selbst.

Quellen

Zuletzt geprüft am 29. September 2026