Wörterbücher definieren und erstellen
Ein Dictionary ist eine veränderliche Zuordnung von eindeutigen Schlüsseln zu Werten. Du schlägst jedes Element über einen aussagekräftigen Schlüssel wie einen Namen, eine Kennung oder ein Datum nach.
Möglichkeiten zum Erstellen von Wörterbüchern
Python bietet mehrere Möglichkeiten zum Erstellen von Wörterbüchern, darunter leere und bereits gefüllte.
# Leere Wörterbücher erstellen
a = {}
b = dict()
print("Leeres Wörterbuch a:", a)
print("Leeres Wörterbuch b:", b)
# Ausgabe: Leeres Wörterbuch a: {}
# Ausgabe: Leeres Wörterbuch b: {}
# Wörterbuch mit Daten erstellen
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'dan': 999}
print("Dictionary phone:", phone)
# Ausgabe: Dictionary phone: {'ann': 110, 'bob': 991, 'cat': 112, 'dan': 999}
# Erstellen eines verschachtelten Wörterbuchs
person = {1: {'name': 'ann', 'age': 23}, 2: {'name': 'bob', 'age': 21}}
print("Verschachteltes Wörterbuch:", person)
# Ausgabe: Verschachteltes Wörterbuch: {1: {'name': 'ann', 'age': 23}, 2: {'name': 'bob', 'age': 21}}
# Wörterbuch mit Konstruktor erstellen
month = dict([(1, 'Jan'), (2, 'Feb'), (3, 'Mar')])
mass = dict(Mercury=3.3e23, Venus=4.9e24, Earth=6.0e24)
print("Dictionary month:", month)
print("Dictionary mass:", mass)
# Ausgabe: Dictionary month: {1: 'Jan', 2: 'Feb', 3: 'Mar'}
# Ausgabe: Dictionary mass: {'Mercury': 3.3e+23, 'Venus': 4.9e+24, 'Earth': 6e+24}Wörterbuchsyntax
Die Darstellung eines Dictionarys verwendet geschweifte Klammern. Kommas trennen die Einträge, ein Doppelpunkt trennt jeweils den Schlüssel vom Wert. Die leere Darstellung {} erzeugt ein leeres Dictionary.
# Grundlegende Wörterbuchsyntax
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'don': 999}
print(phone)
# Ausgabe: {'ann': 110, 'bob': 991, 'cat': 112, 'don': 999}Schlüssel müssen hashbar sein. Strings und Zahlen eignen sich häufig. Ein Tupel ist nur dann hashbar, wenn alle seine Elemente hashbar sind. Ein Tupel mit einer Liste erfüllt diese Bedingung nicht. Listen selbst sind nicht hashbar. Werte dürfen beliebige Python-Objekte sein, auch weitere Dictionaries.
Wörterbuch als Container
Ein Dictionary ist ein Container, weil es eine Sammlung anderer Objekte enthält. Es ordnet jedem Schlüssel genau einen Wert zu und bewahrt dabei die Reihenfolge, in der die Schlüssel erstmals eingefügt wurden.
Listen und Tupel ordnen Elemente nach Position, Dictionaries dagegen nach Schlüsseln. Dieser Unterschied bestimmt, wie du ihre Inhalte liest, aktualisierst und durchläufst.
Wörterbucheigenschaften
Ein Dictionary ist veränderlich, seine Schlüssel sind eindeutig und hashbar, und seine Iterationsreihenfolge folgt der Einfügereihenfolge der Schlüssel. Diese drei Eigenschaften erklären fast alles, was dir später auffällt: warum du Einträge nach dem Anlegen ergänzen oder entfernen kannst, warum eine Zuweisung an einen vorhandenen Schlüssel den alten Wert ersetzt statt einen zweiten Eintrag anzulegen, und warum das Durchlaufen eine stabile Reihenfolge liefert.
Einfügereihenfolge und eindeutige Schlüssel
Die Python-Sprachspezifikation garantiert die Einfügereihenfolge von Dictionaries seit Python 3.7. Ein neuer Wert für einen vorhandenen Schlüssel aktualisiert den Eintrag, ohne den Schlüssel zu verschieben. Löschst du ihn und fügst ihn erneut ein, steht er anschließend am Ende.
# Die Einfügereihenfolge bleibt erhalten
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'bob': 999}
print(phone)
# Ausgabe: {'ann': 110, 'bob': 999, 'cat': 112}
# Der Schlüssel „bob“ bleibt an zweiter Stelle, auch wenn sich sein Wert geändert hatDa Schlüssel eindeutig sind, bleibt bei einem wiederholten Schlüssel in einer Dictionary-Darstellung nur der zuletzt zugewiesene Wert erhalten. Der überlebende Schlüssel behält die Position seines ersten Auftretens.
Zugriff auf Wörterbücher
Um einen Wert aus einem Dictionary abzurufen, gibst du seinen Schlüssel an. Ein verständlicher Schlüssel wie ein Name oder ein Datum übernimmt dabei die Aufgabe eines fortlaufenden Zahlenindex.
Indizierung mit Schlüsseln
# Mit Schlüsseln auf Werte zugreifen
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'dan': 999}
# Werte abrufen
print(phone['cat'])
# Ausgabe: 112
# Variable als Schlüssel verwenden
name = 'bob'
print(phone[name])
# Ausgabe: 991
# Werte hinzufügen oder ändern
phone['bob'] = 999 # Vorhandenen Schlüsselwert ändern
phone['eve'] = 111 # Neuen Schlüssel hinzufügen
print(phone)
# Ausgabe: {'ann': 110, 'bob': 999, 'cat': 112, 'dan': 999, 'eve': 111}Der Zugriff mit eckigen Klammern liest einen vorhandenen Wert. Eine Zuweisung mit eckigen Klammern aktualisiert einen vorhandenen Schlüssel oder hängt ein neues Schlüssel-Wert-Paar an die Einfügereihenfolge an.
Wörterbuch Iteration
Wähle die Iterationsform danach, ob du nur Schlüssel, nur Werte oder beide Teile jedes Eintrags brauchst. Ein Dictionary direkt zu durchlaufen liefert die Schlüssel, .values() liefert die Werte, und .items() liefert Schlüssel-Wert-Paare.
Schlüssel eines Dictionarys durchlaufen
# Iterieren von Wörterbuchschlüsseln
phone = {'ann': 110, 'bob': 999, 'cat': 112, 'dan': 999}
for key in phone:
print(key, phone[key])
# Ausgabe:
# ann 110
# bob 999
# cat 112
# dan 999Wenn du ein Dictionary direkt durchläufst, liefert Python seine Schlüssel in Einfügereihenfolge.
Einträge eines Dictionarys durchlaufen
# Iterieren von Schlüssel-Wert-Paaren mit items()
phone = {'ann': 110, 'bob': 999, 'cat': 112, 'dan': 999}
for key, val in phone.items():
print(key, val)
# Ausgabe:
# ann 110
# bob 999
# cat 112
# dan 999Die Ansicht items() liefert Schlüssel und Wert gemeinsam. Durch Tupelentpackung kannst du beide in einer Schleife benennen.
Drei Arten von Dictionary Views
Ein Dictionary stellt dynamische Ansichten seiner Schlüssel, Werte und Schlüssel-Wert-Paare bereit. Eine solche Ansicht ist keine Kopie: Sie liest bei jeder Iteration den aktuellen Inhalt des Dictionaries, sodass eine Änderung nach dem Erzeugen der Ansicht sofort sichtbar wird.
Dictionary Views erzeugen
# Verwendung von Wörterbuchmethoden
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'dan': 999}
# Alle Schlüssel bekommen
keys = phone.keys()
print("Schlüssel:", list(keys))
# Ausgabe: Schlüssel: ['ann', 'bob', 'cat', 'dan']
# Alle Werte abrufen
values = phone.values()
print("Werte:", list(values))
# Ausgabe: Werte: [110, 991, 112, 999]
# Schlüssel-Wert-Paare abrufen
items = phone.items()
print("Items:", list(items))
# Ausgabe: Items: [('ann', 110), ('bob', 991), ('cat', 112), ('dan', 999)]
snapshot = list(keys)
phone['eve'] = 111
print(list(keys)) # Output: ['ann', 'bob', 'cat', 'dan', 'eve']
print(snapshot) # Output: ['ann', 'bob', 'cat', 'dan']Diese Views lassen sich durchlaufen, unterstützen aber weder Positionsindizes noch Elementzuweisungen. list() erzeugt eine Momentaufnahme der aktuellen Einträge. Ein später hinzugefügter Schlüssel erscheint in der View, nicht aber in der Momentaufnahme. Veränderliche Werte bleiben dabei über Verweise mit denselben Objekten verbunden.
Die Methode Get
Verwende get(), wenn ein fehlender Schlüssel erwartet wird und du einen Ersatzwert möchtest. Verwende eckige Klammern, wenn ein fehlender Schlüssel als Fehler behandelt werden soll.
Fehler beim Klammerzugriff auf fehlende Schlüssel
# Problem beim Zugriff auf nicht vorhandene Schlüssel
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'dan': 999}
try:
print(phone['pat'])
except KeyError as e:
print("KeyError:", e)
# Ausgabe: KeyError: 'pat'Der Zugriff auf einen nicht vorhandenen Schlüssel mit eckigen Klammern führt zu einem KeyError.
Lösung mit der Methode Get
# Verwendung der get()-Methode für sicheren Zugriff
phone = {'ann': 110, 'bob': 991, 'cat': 112, 'dan': 999}
# get() gibt None zurück, wenn der Schlüssel nicht vorhanden ist
result = phone.get('pat')
print("Ergebnis get('pat'):", result)
# Ausgabe: Ergebnis get('pat'): None
# get() mit Standardwert
result = phone.get('pat', -1)
print("Ergebnis get('pat', -1):", result)
# Ausgabe: Ergebnis get('pat', -1): -1
# get() für vorhandenen Schlüssel
result = phone.get('ann')
print("Ergebnis get('ann'):", result)
# Ausgabe: Ergebnis get('ann'): 110get() gibt den gespeicherten Wert zurück, wenn der Schlüssel vorhanden ist. Andernfalls liefert die Methode den angegebenen Standardwert oder None, wenn kein Standardwert übergeben wurde. Wähle einen Standard, der nicht mit einem gültigen gespeicherten Wert verwechselt werden kann, falls diese Unterscheidung wichtig ist.