Aufwärmen · Aufgabe 1 von 7
// 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.
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
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])Ü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]Üben · Aufgabe 4 von 7
Zwei for-Klauseln. Was gibt das aus?
print([x + y for x in "ab" for y in "12"])Ü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. result.append(w.upper())
- 2. if w:
- 3.result = []
- 4.for w in words:
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])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.pyAusgabe
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
Hinweis 1
Ein Filter steht am Ende der Comprehension: … for w in words if bedingung.
Hinweis 2
len(w) liefert die Anzahl der Buchstaben. „Mindestens“ heißt >=.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.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
Hinweis 1
Die innere Comprehension baut eine Reihe: [letter + str(number) for number in range(1, cols + 1)].
Hinweis 2
Die äußere führt die innere einmal pro Buchstabe in "ABCDEFGHIJ"[:rows] aus.
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.pyPrüfungen ausführen (learnrun.py muss im selben Ordner liegen):
python learnrun.py testlearnrun.py herunterladenHä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' expressionWarum, 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 rangeWarum, 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.