Aufwärmen · Aufgabe 1 von 7
// B4.5 · ca. 35 Min. · Einstieg
Dictionaries und Schleifentechniken
Nach dieser Lektion speichern Sie Werte unter Schlüsseln und schlagen sie nach, durchlaufen Dicts und Sequenzen auf die üblichen Arten und bauen aus Dicts und Listen einen Wortzähler.
Vorhersagen · Aufgabe 2 von 7
Sagen Sie voraus, bevor Sie weiterlesen: Was gibt das aus?
stock = {"apple": 3} stock["pear"] = 5 stock["apple"] = 1 print(stock)Üben · Aufgabe 3 von 7
Ergänzen Sie den Standardwert, sodass die Schleife jedes Wort zählt.
counts = {} for word in ["a", "b", "a"]: counts[word] = counts.get(word, ____) + 1counts[word] = counts.get(word, ) + 1Üben · Aufgabe 4 von 7
Was gibt das aus?
print(list(enumerate("ab", start=1)))Üben · Aufgabe 5 von 7
Mit d = {"b": 2, "a": 1}: Ordnen Sie jedem Schleifenhelfer die Elemente zu, die er liefert.
d = {"b": 2, "a": 1}Denksport · Aufgabe 6 von 7
Knobelaufgabe. Drei Namen, zwei Punktzahlen. Was gibt das aus?
names = ["ana", "ben", "cleo"] scores = [3, 5] print(dict(zip(names, scores)))Anwenden · Aufgabe 7 von 7
Mini-Aufgabe. Schreiben Sie invert(phone_book): Die Funktion bekommt ein Dict von Namen auf Nummern und liefert ein neues Dict von Nummern auf Namen. Testen Sie sie mit {"ana": "0151", "ben": "0170"}. Probieren Sie dann zwei Namen mit derselben Nummer aus, und erklären Sie, was Sie sehen.
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
Ein kleines Notenbuch
Ein Dict mit Noten wird geändert, gelesen, durchlaufen und gerankt. sorted() mit key ordnet die Namen nach Note, und enumerate() nummeriert die Plätze. zip() macht aus zwei Listen neue Einträge, und eine Dict Comprehension filtert die besten Noten heraus. Ändern Sie eine Note oder fügen Sie jemanden hinzu, und führen Sie es erneut aus.
main.py
grades = {"ana": 91, "ben": 78}
grades["cleo"] = 85 # a new key is added
grades["ben"] = 81 # an existing key gets a new value
print(grades)
print("ben" in grades, "dan" in grades, grades.get("dan", "no grade"))
for name, grade in grades.items():
print(name, grade)
ranking = sorted(grades, key=lambda name: grades[name], reverse=True)
for place, name in enumerate(ranking, start=1):
print(place, name)
newcomers = ["eve", "fay"]
marks = [88, 73]
print({name: mark for name, mark in zip(newcomers, marks)})
print({name: grade for name, grade in grades.items() if grade >= 85})
Ausführen mit
python main.pyAusgabe
{'ana': 91, 'ben': 81, 'cleo': 85}
True False no grade
ana 91
ben 81
cleo 85
1 ana
2 cleo
3 ben
{'eve': 88, 'fay': 73}
{'ana': 91, 'cleo': 85}- ben behält seine Position, wenn sich seine Note ändert; nur neue Schlüssel kommen ans Ende.
- grades.get("dan", "no grade") liefert den Standardwert, statt KeyError auszulösen.
- Das lambda sagt sorted(), dass es die Noten vergleichen soll, nicht die Namen.
Ä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 3
Saubere Wörter
Schritt 1 eines Wortzählers. words(text) soll die Wörter von text kleingeschrieben liefern, mit an beiden Enden entfernten Satzzeichen und ohne Teile, die nur aus Satzzeichen bestanden. Der Starter teilt den Text nur auf. word.strip(PUNCTUATION) entfernt diese Zeichen an beiden Enden eines Worts.
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
Schreiben Sie zuerst den ganzen Text klein, und teilen Sie ihn dann auf.
Hinweis 2
Eine List Comprehension kann jedes Wort säubern; eine zweite kann die leeren Strings verwerfen.
Hinweis 3
cleaned = [word.strip(PUNCTUATION) for word in text.lower().split()], dann return [word for word in cleaned if word]
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
PUNCTUATION = ".,!?;:"
def words(text: str) -> list[str]:
"""Split text into lower-case words without surrounding punctuation."""
cleaned = [word.strip(PUNCTUATION) for word in text.lower().split()]
return [word for word in cleaned if word]
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
PUNCTUATION = ".,!?;:"
def words(text: str) -> list[str]:
"""Split text into lower-case words without surrounding punctuation."""
return text.split()
test_main.py
from main import words
def test_lower_case():
"""Schreibt jedes Wort klein"""
got = words("The Cat")
assert got == ["the", "cat"], f"words('The Cat') lieferte {got!r}, erwartet: ['the', 'cat']"
def test_punctuation():
"""Entfernt Satzzeichen an den Wortenden"""
got = words("Hello, world! Hello?")
assert got == ["hello", "world", "hello"], f"erhalten: {got!r}, erwartet: ['hello', 'world', 'hello']"
def test_no_empty_words():
"""Verwirft Teile, die nur aus Satzzeichen bestanden"""
got = words("wait ... what")
assert got == ["wait", "what"], f"words('wait ... what') lieferte {got!r}, erwartet: ['wait', 'what']"
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 3
Die Wörter zählen
Schritt 2. count_words(word_list) soll ein Dict liefern, das jedem Wort seine Häufigkeit zuordnet, mit den Wörtern in der Reihenfolge ihres ersten Auftretens. words() aus Schritt 1 ist schon da. Ergänzen Sie die Schleife.
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
Durchlaufen Sie word_list, und aktualisieren Sie counts für jedes Wort.
Hinweis 2
counts.get(word, 0) ist die bisherige Zahl, oder 0 für ein neues Wort.
Hinweis 3
for word in word_list: counts[word] = counts.get(word, 0) + 1
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
PUNCTUATION = ".,!?;:"
def words(text: str) -> list[str]:
"""Split text into lower-case words without surrounding punctuation."""
cleaned = [word.strip(PUNCTUATION) for word in text.lower().split()]
return [word for word in cleaned if word]
def count_words(word_list: list[str]) -> dict[str, int]:
"""Return how often each word occurs."""
counts: dict[str, int] = {}
for word in word_list:
counts[word] = counts.get(word, 0) + 1
return counts
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
PUNCTUATION = ".,!?;:"
def words(text: str) -> list[str]:
"""Split text into lower-case words without surrounding punctuation."""
cleaned = [word.strip(PUNCTUATION) for word in text.lower().split()]
return [word for word in cleaned if word]
def count_words(word_list: list[str]) -> dict[str, int]:
"""Return how often each word occurs."""
counts: dict[str, int] = {}
# Add 1 to the count of each word; a new word starts at 0.
return counts
test_main.py
from main import count_words, words
def test_counts():
"""Zählt jedes Wort"""
got = count_words(["the", "cat", "the"])
assert got == {"the": 2, "cat": 1}, f"erhalten: {got!r}, erwartet: {{'the': 2, 'cat': 1}}"
def test_first_seen_order():
"""Behält die Wörter in der Reihenfolge ihres ersten Auftretens"""
got = list(count_words(["b", "a", "b"]))
assert got == ["b", "a"], f"die Schlüssel sind {got!r}, erwartet: ['b', 'a']"
def test_with_words():
"""Funktioniert mit dem Ergebnis von words()"""
got = count_words(words("Go, go, GO!"))
assert got == {"go": 3}, f"erhalten: {got!r}, erwartet: {{'go': 3}}"
def test_empty():
"""Keine Wörter ergeben ein leeres Dict"""
got = count_words([])
assert got == {}, f"count_words([]) 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 3 von 3
Die häufigsten Wörter
Schritt 3. top_words(counts, n) soll die n häufigsten Paare (Wort, Anzahl) liefern, die höchste Anzahl zuerst, Wörter mit gleicher Anzahl alphabetisch. Der Starter sortiert nur alphabetisch. Das Programm unten gibt mit enumerate() die drei häufigsten Wörter eines Satzes aus.
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
Sortieren Sie counts.items() mit einer key-Funktion, die auf die Anzahl schaut.
Hinweis 2
Ein key darf ein Tupel liefern: Python vergleicht erst den ersten Teil, dann den zweiten. Eine negative Anzahl sortiert hohe Zahlen nach vorn.
Hinweis 3
sorted(counts.items(), key=lambda item: (-item[1], item[0]))[:n]
Eine Lösung zeigen
Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.
PUNCTUATION = ".,!?;:"
def words(text: str) -> list[str]:
"""Split text into lower-case words without surrounding punctuation."""
cleaned = [word.strip(PUNCTUATION) for word in text.lower().split()]
return [word for word in cleaned if word]
def count_words(word_list: list[str]) -> dict[str, int]:
"""Return how often each word occurs."""
counts: dict[str, int] = {}
for word in word_list:
counts[word] = counts.get(word, 0) + 1
return counts
def top_words(counts: dict[str, int], n: int) -> list[tuple[str, int]]:
"""Return the n most frequent (word, count) pairs; ties in alphabetical order."""
ranked = sorted(counts.items(), key=lambda item: (-item[1], item[0]))
return ranked[:n]
text = "The cat saw the dog. The dog saw a bird!"
for place, (word, count) in enumerate(top_words(count_words(words(text)), 3), start=1):
print(place, word, count)
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
PUNCTUATION = ".,!?;:"
def words(text: str) -> list[str]:
"""Split text into lower-case words without surrounding punctuation."""
cleaned = [word.strip(PUNCTUATION) for word in text.lower().split()]
return [word for word in cleaned if word]
def count_words(word_list: list[str]) -> dict[str, int]:
"""Return how often each word occurs."""
counts: dict[str, int] = {}
for word in word_list:
counts[word] = counts.get(word, 0) + 1
return counts
def top_words(counts: dict[str, int], n: int) -> list[tuple[str, int]]:
"""Return the n most frequent (word, count) pairs; ties in alphabetical order."""
return sorted(counts.items())[:n]
text = "The cat saw the dog. The dog saw a bird!"
for place, (word, count) in enumerate(top_words(count_words(words(text)), 3), start=1):
print(place, word, count)
test_main.py
from main import top_words
def test_most_frequent_first():
"""Setzt das häufigste Wort an den Anfang"""
got = top_words({"a": 1, "the": 3, "dog": 2}, 2)
assert got == [("the", 3), ("dog", 2)], f"erhalten: {got!r}, erwartet: [('the', 3), ('dog', 2)]"
def test_ties_alphabetical():
"""Wörter mit gleicher Anzahl stehen alphabetisch"""
got = top_words({"saw": 2, "dog": 2, "the": 3}, 3)
assert got == [("the", 3), ("dog", 2), ("saw", 2)], f"erhalten: {got!r}, erwartet: [('the', 3), ('dog', 2), ('saw', 2)]"
def test_n_larger_than_dict():
"""Liefert alle Paare, wenn n größer ist als die Zahl der Wörter"""
got = top_words({"hi": 1}, 5)
assert got == [("hi", 1)], f"erhalten: {got!r}, erwartet: [('hi', 1)]"
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
Einen fehlenden Schlüssel mit [] lesen
stock = {"apple": 3}
print(stock["pear"])
Was Python ausgibt
KeyError: 'pear'Warum, und die Lösung
d[key] löst KeyError aus, wenn der Schlüssel fehlt. Prüfen Sie vorher mit if "pear" in stock, oder nutzen Sie stock.get("pear", 0) für einen Standardwert.
Schlüssel löschen, während man das Dict durchläuft
stock = {"apple": 0, "pear": 5}
for fruit in stock:
if stock[fruit] == 0:
del stock[fruit]
Was Python ausgibt
RuntimeError: dictionary changed size during iterationWarum, und die Lösung
Durchlaufen Sie eine Kopie der Schlüssel, for fruit in list(stock), oder bauen Sie ein neues Dict: stock = {k: v for k, v in stock.items() if v != 0}.
Eine Liste als Schlüssel verwenden
seats = {["row", 1]: "ana"}
Was Python ausgibt
TypeError: cannot use 'list' as a dict key (unhashable type: 'list')Warum, und die Lösung
Dict-Schlüssel müssen hashbar sein wie Set-Elemente. Nehmen Sie ein Tupel: {("row", 1): "ana"}.
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.