mitmario.dev

Durch ein Dictionary laufen

Python Sandbox 3 Min Lesezeit 4 BeispieleLektion 2 von 7

Zum Nachschlagen musst du den Schlüssel kennen. Oft ist es aber umgekehrt. Du willst die ganze Preisliste ausdrucken, den ganzen Lagerbestand durchgehen oder alles zusammenzählen, und welche Schlüssel darin stehen, weißt du vorher gar nicht.

Dafür ist die for-Schleife da. Bei einem Dictionary gibt es drei Wege, über die Schlüssel, über die Paare und über die Werte.

Über die Schlüssel

Jeder Schlüssel einmal
preise = {"Milch": 1.19, "Brot": 2.49, "Eier": 3.29, "Butter": 2.29}
for artikel in preise:
    print(artikel, preise[artikel])

Eine for-Schleife über ein Dictionary läuft über seine Schlüssel, einen je Runde. Den Wert holst du dir in der Schleife mit den eckigen Klammern. Einen KeyError gibt es dabei nicht, denn jeder Schlüssel kommt ja aus dem Dictionary selbst.

Schlüssel und Wert zusammen

Schlüssel und Wert als Paar
preise = {"Milch": 1.19, "Brot": 2.49, "Eier": 3.29, "Butter": 2.29}
for paar in preise.items():
    print(paar)
for artikel, preis in preise.items():
    print(f"{artikel:<8}{preis:>6.2f}")

Bequemer geht es mit items() (Einträge). Damit bekommst du in jeder Runde ein Paar aus Schlüssel und Wert, und in der ersten Schleife siehst du, dass es ein Tupel ist. Stehen nach dem for zwei Namen, wird es gleich ausgepackt, genau wie bei enumerate und zip. Dann hat jeder Teil seinen eigenen Namen, und die Zeile mit den Spalten liest sich fast wie ein Satz.

Sobald in der Schleife beides gebraucht wird, sieht man diese Form am häufigsten. Mit for artikel in preise und preise[artikel] kommt dasselbe heraus. Es wird nur in jeder Runde einmal mehr nachgeschlagen.

Nur die Werte

Nur die Werte
preise = {"Milch": 1.19, "Brot": 2.49, "Eier": 3.29, "Butter": 2.29}
print(f"{sum(preise.values()):.2f}")
print(max(preise.values()))
print(max(preise))

values() (Werte) liefert nur die Werte, ohne die Schlüssel. Damit funktionieren sum und max wie bei einer Liste. Die vier Artikel kosten zusammen 9,26 Euro, und der teuerste kostet 3,29 Euro.

Warum das values() wichtig ist, steht in der letzten Zeile. max(preise) antwortet mit Milch, und Milch ist nicht der teuerste Artikel. Ohne values() sieht max nur die Schlüssel, also gewinnt das Wort, das im Alphabet am weitesten hinten steht, und das ist von den vier eben Milch.

Welcher Artikel 3,29 Euro kostet, verrät max(preise.values()) übrigens nicht. Du bekommst nur die Zahl. Den Schlüssel zum größten Wert zu finden oder ein Dictionary nach seinen Werten zu sortieren, geht mit einem Werkzeug aus Lektion 8.7. Bis dahin hilft die Schleife, die sich den teuersten Tag gemerkt hat.

Die Reihenfolge

Die Reihenfolge, in der etwas hineinkam
bestand = {}
bestand["Milch"] = 3
bestand["Brot"] = 12
bestand["Eier"] = 30
print(bestand)
print(sorted(bestand))
for artikel in sorted(bestand):
    print(artikel, bestand[artikel])
for artikel, stueck in sorted(bestand.items()):
    print(artikel, stueck)

Ein Dictionary merkt sich die Reihenfolge, in der die Paare hineingekommen sind, und jede Schleife geht sie genau so durch. Hier also Milch, Brot, Eier, weil die Inventur so gelaufen ist. Mit dem Alphabet hat das nichts zu tun. Wenn eine Ausgabe in einer bestimmten Reihenfolge erscheinen soll, wird deshalb sortiert. Auf die Reihenfolge des Hineinkommens verlässt man sich nur, wenn sie wirklich gemeint ist.

Dafür gibt es sorted(). Bei einem Dictionary gibt es eine Liste seiner Schlüssel zurück, nach dem Alphabet sortiert, und über diese Liste läuft die Schleife. Das Dictionary selbst bleibt, wie es war.

Wenn du lieber mit Paaren arbeitest, nimmst du sorted(bestand.items()). Tupel werden zuerst nach ihrem ersten Teil sortiert. Das ist hier der Schlüssel, und den gibt es nur einmal. Beide Schleifen geben dasselbe aus.

Was die Aufgabe will

Mias Laden „Zur Ecke“ macht Inventur. Der Bestand kommt als Dictionary an, in der Reihenfolge, in der gezählt wurde, und daraus wird eine Liste nach dem Alphabet. Wo weniger als fünf Stück im Regal liegen, steht dahinter, dass nachbestellt werden muss.

Zum Mitnehmen

Eine for-Schleife über ein Dictionary bekommt in jeder Runde einen Schlüssel, mit items() Schlüssel und Wert zusammen und mit values() nur die Werte. Die Reihenfolge ist die, in der alles hineinkam. Nach dem Alphabet geht es erst mit sorted().

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.