Abschnitt 7 · Lektion 1
Dictionaries
Artikel und Preise stehen auf zwei Listen. Wenn du den Preis der Milch wissen willst, suchst du erst ihre Position in der einen Liste und liest dann an derselben Position in der anderen nach.
artikel = ["Brot", "Milch", "Eier"]
preise = [2.49, 1.19, 3.29]
stelle = artikel.index("Milch")
print(stelle)
print(preise[stelle]) index() findet die Milch an Position 1, und an Position 1 der Preisliste stehen 1,19 Euro. Das
klappt, solange beide Listen genau zusammenpassen. Wenn jemand vorn einen Artikel einfügt und den
Preis vergisst, gehört ab da jeder Preis zum falschen Artikel. Eine Fehlermeldung gibt es dafür
nicht.
Eigentlich willst du den Preis über den Namen des Artikels finden, so wie man in einem Wörterbuch ein Wort nachschlägt und nicht die Seite 214.
Ein Wörterbuch für Preise
preise = {"Brot": 2.49, "Milch": 1.19, "Eier": 3.29}
print(preise)
print(preise["Milch"])
print(len(preise)) Dafür gibt es das Dictionary (dict, auf Deutsch Wörterbuch). Es steht in geschweiften Klammern
und besteht aus Paaren. Links steht ein Schlüssel (key), dann ein Doppelpunkt und rechts der
Wert (value), der dazugehört. Zwischen den Paaren steht ein Komma. In preise ist "Brot" ein
Schlüssel und 2.49 sein Wert.
Gelesen wird mit eckigen Klammern wie bei einer Liste. Nur steht darin keine Position, sondern der
Schlüssel. preise["Milch"] ist der Wert, der unter Milch steht. len() zählt die Paare, hier
drei.
Jeder Schlüssel kommt in einem Dictionary nur einmal vor. Steht "Brot" zweimal in den Klammern,
gewinnt still der zweite Wert. Die Schlüssel sind hier Texte und stehen deshalb in
Anführungszeichen. Umlaute sind darin ganz normal, anders als bei Variablennamen, wo dieser Kurs sie
meidet. "Käse" ist ein Schlüssel wie jeder andere.
Wenn es den Schlüssel nicht gibt
preise = {"Brot": 2.49, "Milch": 1.19, "Eier": 3.29}
print(preise["Brot"])
print(preise["Butter"]) Brot kostet 2,49 Euro, und dann ist Schluss. Es kommt KeyError: 'Butter', ein Schlüsselfehler.
Hinter dem Doppelpunkt steht der Schlüssel, den Python gesucht und nicht gefunden hat. Ein „weiß ich
nicht“ gibt es an dieser Stelle nicht. Das Programm hält an, genau wie bei einer Position zu weit in
einer Liste.
Gesucht wird dabei wörtlich das, was in den Klammern steht. preise["brot"] gibt auch einen
KeyError, diesmal mit 'brot', denn klein geschrieben ist es ein anderer Text. Und wenn du aus
Gewohnheit preise[0] schreibst, bekommst du KeyError: 0. Python sucht dann einen Schlüssel 0
und nicht den ersten Eintrag. Positionen gibt es in einem Dictionary nicht.
Erst nachsehen
preise = {"Brot": 2.49, "Milch": 1.19, "Eier": 3.29}
print("Butter" in preise)
print("Brot" in preise)
print(2.49 in preise)
artikel = "Butter"
if artikel in preise:
print(f"{artikel}: {preise[artikel]:.2f} Euro")
else:
print(f"{artikel} gibt es hier nicht.") in kennst du von Listen und von Text. Bei einem Dictionary fragt es, ob es einen Schlüssel
gibt, und sonst nichts. 2.49 in preise ist False, obwohl Brot genau so viel kostet. Die Werte
sieht in gar nicht an.
Mit in und einem if wird aus dem Absturz eine Antwort. Den Preis gibt es nur, wenn es den
Schlüssel gibt, und sonst kommt der Satz, dass es den Artikel hier nicht gibt. In den eckigen
Klammern steht diesmal kein fester Text, sondern die Variable artikel, und gesucht wird der Text,
der darin steht.
Holen mit Standardwert
preise = {"Brot": 2.49, "Milch": 1.19, "Eier": 3.29}
print(preise.get("Brot"))
print(preise.get("Butter"))
print(preise.get("Butter", 0))
print(preise.get("Brot", 0)) Für einen häufigen Fall gibt es eine Abkürzung. get (holen) liest wie die eckigen Klammern, hält
aber nicht an, wenn der Schlüssel fehlt. Dann kommt None zurück, das „noch kein Wert“ aus Lektion
3.5. Wenn du in die Klammern einen zweiten Wert schreibst, kommt stattdessen dieser zurück. Das ist
der Standardwert (default). Gibt es den Schlüssel, ist der Standardwert egal, und get liefert
den echten Wert.
Welche Form passt, hängt davon ab, was ein fehlender Schlüssel bedeutet. Beim Zählen heißt „noch
nicht da“ einfach 0, und dafür ist get mit Standardwert wie gemacht. Bei einer Preisliste wäre
preise.get("Butter", 0) dagegen eine kühne Behauptung. Die Butter gäbe es dann geschenkt. Wenn der
fehlende Fall eine eigene Antwort braucht, ist in die ehrlichere Frage.
Hinzufügen, ändern, streichen
preise = {"Brot": 2.49, "Milch": 1.19, "Eier": 3.29}
preise["Butter"] = 2.29
preise["Milch"] = 1.29
del preise["Eier"]
print(preise)
print(len(preise)) Hinzufügen und Ändern sehen gleich aus. Der Schlüssel in eckigen Klammern, ein Gleichheitszeichen,
der Wert. Gibt es den Schlüssel noch nicht, kommt ein neues Paar dazu, so wie hier die Butter. Gibt
es ihn schon, bekommt er den neuen Wert, und der alte ist weg, so wie bei der Milch. Ein append
brauchst du dafür nicht.
del (von delete, löschen) streicht ein Paar ganz. Auch das geht nur mit einem Schlüssel, den es
gibt, sonst kommt wieder der KeyError.
Beim Ausgeben fällt dir auf, dass die Butter hinten steht. Ein Dictionary merkt sich die Reihenfolge, in der die Paare hineingekommen sind. Was das für eine Ausgabe heißt, die nach dem Alphabet sortiert sein soll, steht in der nächsten Lektion.
Was die Aufgabe will
Ein Laden hat seine Preisliste als Dictionary, und Kundschaft fragt nach Preisen. Zu jedem gefragten Artikel soll das Programm sagen, was er kostet oder dass es ihn nicht gibt. Am Ende wird zusammengerechnet, was die vorhandenen Artikel kosten. Die Preise stehen mit Punkt da, wie Python sie schreibt. Deutsche Zahlen kommen wieder, sobald es eine Funktion dafür gibt.
Zum Mitnehmen
In einem Dictionary findest du einen Wert über seinen Schlüssel und nicht über eine Position. Fragst du mit eckigen Klammern nach einem Schlüssel, den es nicht gibt, ist mit einem KeyError Schluss. Mit in fragst du vorher nach, und get gibt in dem Fall einen Standardwert zurück.
Jetzt du
Basis Konto, kostenlosZu 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 6 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.