Python-Kurs / Mit Dictionaries Schlüssel, Werte und Kategoriesummen verwalten
Ein Dictionary ordnet Schlüsseln Werte zu und ermöglicht den Zugriff über diese Schlüssel. Es eignet sich für benannte Datenfelder und Summen nach Kategorien; legen Sie dabei ausdrücklich fest, ob ein fehlender Schlüssel ein Fehler ist oder einen Standardwert erhalten soll.
Schlüssel, Werte und Ersetzen vorhandener Einträge verstehen
Ein Dictionary-Literal enthält in geschweiften Klammern Paare aus Schlüssel: Wert. Wenn Sie einem vorhandenen Schlüssel erneut einen Wert zuweisen, ersetzen Sie dessen bisherigen Wert. Es entsteht kein zweiter Eintrag mit demselben Schlüssel.
Speichern Sie dieses vollständige Beispiel als record_update.py und führen Sie python record_update.py mit dem Projektinterpreter aus:
expense = {"name": "lunch", "amount": 8000}
expense["amount"] = 9000
print(expense["amount"])
Die Ausgabe lautet 9000. Das Feld amount hatte zunächst 8000 und wurde anschließend ersetzt. Dictionaries erhalten die Einfügereihenfolge; das bedeutet jedoch keine automatische alphabetische oder numerische Sortierung. Eine gewünschte Ausgabereihenfolge müssen Sie selbst festlegen.
Schlüssel müssen hashbar sein. Dazu gehört ein während der Lebensdauer stabiler Hashwert; Objekte, die als gleich gelten, müssen denselben Hashwert haben. Zeichenketten und ganze Zahlen sind häufige Schlüsseltypen. Listen sind nicht hashbar, und auch ein Tupel mit einer enthaltenen Liste ist ungeeignet. Die offizielle Definition von Hashbarkeit und die Tupelübung erläutern diesen Unterschied.
Bei Textschlüsseln sind Groß- und Kleinschreibung sowie Leerzeichen relevant: food, Food und food sind unterschiedliche Werte. Die Dictionary-Referenz für Python 3.12 beschreibt Zugriff und Reihenfolge.
Ein vollständiges Beispiel für Kategoriesummen ausführen
Speichern Sie den gesamten Inhalt als dicts.py in UTF-8 im Übungsordner. Starten Sie python dicts.py im ausgewählten Projektinterpreter. Unter macOS oder Ubuntu kann außerhalb einer aktivierten Umgebung python3 der passende Befehl sein. Es sind keine Zusatzpakete oder Eingabedateien nötig.
expenses = [("food", 8000), ("transport", 2500), ("food", 3500)]
totals = {}
for category, amount in expenses:
totals[category] = totals.get(category, 0) + amount
for category, total in sorted(totals.items()):
print(category, total)
print(totals.get("books", 0))
Erwartete Ausgabe:
food 11500
transport 2500
0
Die drei Tupel enthalten jeweils Kategorie und Betrag. Beim ersten food-Eintrag fehlt der Schlüssel noch in totals; get(category, 0) liefert daher null. Die anschließende Zuweisung speichert 8000. Der zweite food-Eintrag findet diesen vorhandenen Wert und addiert 3500, sodass 11500 entsteht. transport bleibt bei 2500.
totals.items() liefert Schlüssel-Wert-Paare. sorted ordnet hier die Paare für die Ausgabe nach den Kategoriezeichenketten; es sortiert nicht die Einfügereihenfolge des Dictionaries um. Die letzte Ausgabe liefert null für den fehlenden Schlüssel books.
Erforderlichen Zugriff und einen Standardwert unterscheiden
totals["books"] löst KeyError aus, wenn der Schlüssel fehlt. totals.get("books", 0) gibt in diesem Fall null zurück, fügt books aber nicht ein. Mit "books" in totals prüfen Sie unabhängig davon, ob der Schlüssel vorhanden ist.
Null ist beim ersten Beitrag zu einer Summe ein sinnvoller Startwert. Bei einem verpflichtenden Datenfeld könnte derselbe Standard dagegen einen Fehler verbergen. Außerdem unterscheidet get einen fehlenden Schlüssel nicht von einem vorhandenen Schlüssel mit demselben Rückgabewert. Entscheiden Sie deshalb anhand des Datenvertrags, ob ein Feld fehlen darf.
for key in totals durchläuft die Schlüssel. Für Werte verwenden Sie values(), für Schlüssel und Werte gemeinsam items(). Diese Unterschiede sind beim Entpacken wichtig: Einen Schlüsseltext als angebliches Wertepaar zu lesen, erfüllt nicht dieselbe Aufgabe.
Wenn die wiederholte Initialisierung bei null unübersichtlich wird, können Sie collections.defaultdict(int) prüfen. Es ruft beim fehlenden Zugriff per eckiger Klammer eine Fabrikfunktion auf und legt einen Eintrag an. Ein gewöhnliches dict.get hat diesen Einfügeeffekt nicht. Die Referenz zu defaultdict erklärt auch, dass diese Behandlung nicht für jede Zugriffsmethode gilt.
Ein mit copy() kopiertes Dictionary ist grundsätzlich flach. Enthaltene Listen können weiterhin gemeinsam verwendet werden. Das Kopieren der äußeren Zuordnung ist also nicht gleichbedeutend mit einer unabhängigen Kopie aller Daten.
Normalisierung, fehlende Daten und Änderungen testen
- Ändern Sie im vollständigen Beispiel nur den zweiten food-Betrag von 3500 zu 4500. Erwarten Sie
food 12500; die anderen Ausgaben bleiben gleich. Stellen Sie 3500 wieder her. - Ändern Sie nur den zweiten Kategorieschlüssel
foodinFood. Sie erhalten zwei getrennte Gruppen. Entscheiden Sie bewusst, ob Ihre Anwendung Schreibweisen vereinheitlichen darf, statt unbemerkt Schlüssel umzuschreiben. - Prüfen Sie nach der ursprünglichen Ausführung
"books" in totals. Das Ergebnis bleibtFalse, obwohlget("books", 0)zuvor null zurückgab. Falls books verpflichtend ist, prüfen Sie die Existenz statt den Standardwert als Nachweis zu verwenden. - Stellen Sie den Originaldatensatz wieder her und vergleichen Sie alle drei Ausgabezeilen.
Fügen Sie während der Iteration über dasselbe Dictionary keine Schlüssel hinzu und entfernen Sie keine. Solche strukturellen Änderungen können RuntimeError auslösen oder die beabsichtigte Verarbeitung verhindern. Sammeln Sie zu ändernde Schlüssel zuerst separat oder erzeugen Sie eine neue Zuordnung als Ergebnis.
Das einfache Summenbeispiel nimmt passende Zahlen mit einheitlicher Bedeutung an. Negative oder falsch typisierte Beträge, unerlaubte Kategorien und fehlende Pflichtfelder benötigen eigene Prüfungen. Ein komfortabler Standardwert sollte nicht darüber entscheiden, ob Geschäftsdaten gültig sind.




