Zum Inhalt springen
aviral gupta

// 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.

Lektion 5 von 6 in B4 Datenstrukturen

Danach können Sie

  • Dicts anlegen und ändern, Werte mit [] und get() lesen und Schlüssel mit in prüfen
  • Mit items(), enumerate(), zip(), sorted() und reversed() durchlaufen
  • Dicts mit Comprehensions bauen und mit get() zählen
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen aus Lektion B4.4: Welche dieser Ausdrücke erzeugen ein Set? Wählen Sie alle zutreffenden.

    Wählen Sie alle zutreffenden aus.

  2. 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)
  3. Ü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, ____) + 1
    counts[word] = counts.get(word, ) + 1
  4. Üben · Aufgabe 4 von 7

    Was gibt das aus?

    print(list(enumerate("ab", start=1)))
  5. Ü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}
  6. 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)))
  7. 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.py

Ausgabe

{'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
  1. Hinweis 1

    Schreiben Sie zuerst den ganzen Text klein, und teilen Sie ihn dann auf.

  2. Hinweis 2

    Eine List Comprehension kann jedes Wort säubern; eine zweite kann die leeren Strings verwerfen.

  3. 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.py

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

python learnrun.py test
learnrun.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
  1. Hinweis 1

    Durchlaufen Sie word_list, und aktualisieren Sie counts für jedes Wort.

  2. Hinweis 2

    counts.get(word, 0) ist die bisherige Zahl, oder 0 für ein neues Wort.

  3. 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.py

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

python learnrun.py test
learnrun.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
  1. Hinweis 1

    Sortieren Sie counts.items() mit einer key-Funktion, die auf die Anzahl schaut.

  2. 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.

  3. 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.py

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

python learnrun.py test
learnrun.py herunterladen

Hä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 iteration

Warum, 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.

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

Schlüssel und Werte

Ein Dict ordnet Schlüsseln Werte zu: ages = {"ana": 30, "ben": 25}. ages["ana"] liest einen Wert, und ages["cleo"] = 41 fügt einen Schlüssel hinzu oder ersetzt den Wert eines vorhandenen, denn jeder Schlüssel kommt nur einmal vor. Einen fehlenden Schlüssel mit [] zu lesen löst KeyError aus; ages.get("dan") liefert stattdessen None, ages.get("dan", 0) liefert 0. "ana" in ages prüft die Schlüssel, nicht die Werte. del ages["ben"] entfernt einen Schlüssel. Schlüssel müssen hashbar sein wie Set-Elemente, und ein Dict merkt sich die Reihenfolge, in der seine Schlüssel hinzukamen.

Schleifentechniken

for key in d durchläuft die Schlüssel. for key, value in d.items() liefert beides zugleich. enumerate(seq) paart jedes Element mit seiner Position, gezählt ab 0, mit start=1 ab 1. zip(a, b) geht zwei Sequenzen parallel durch und hört bei der kürzeren auf. sorted(seq) durchläuft sortiert, reversed(seq) rückwärts; beide lassen das Original unverändert. Fügen Sie in einem Dict keine Schlüssel hinzu und löschen Sie keine, während Sie es durchlaufen: Durchlaufen Sie stattdessen list(d), oder bauen Sie ein neues Dict.

Dict Comprehensions und Zählen

Eine Dict Comprehension baut ein Dict in einem Ausdruck: {w: len(w) for w in words}. Mit einem if wird gefiltert: {k: v for k, v in prices.items() if v < 4}. dict(zip(keys, values)) macht aus zwei Listen ein Dict. Die klassische Zählschleife nutzt get() mit Standardwert: counts[w] = counts.get(w, 0) + 1 beginnt jedes neue Wort bei 0. Um das Ergebnis zu ranken, sortieren Sie die Paare nach ihrer Anzahl: sorted(counts.items(), key=lambda item: item[1], reverse=True).

Quellen

Zuletzt geprüft am 29. September 2026