Dictionaries in Python (dict): Anlegen, Methoden, Durchlaufen, Sortieren und frozendict
Ein Dictionary in Python (dict) ist eine veränderbare Sammlung von Paaren „Schlüssel — Wert“, in der Sie einen Wert nahezu sofort über seinen Schlüssel finden. Man legt es mit geschweiften Klammern an, zum Beispiel {"Kaffee": 250}, oder mit der Funktion dict(). Schlüssel sind eindeutig und müssen hashbar sein, seit Python 3.7 bleibt die Einfügereihenfolge erhalten, und in Python 3.15 gibt es die unveränderliche Variante frozendict.
Ein Dictionary in Python (dict) ist eine Sammlung von Paaren aus „Schlüssel und Wert“. Den Wert finden Sie über seinen Schlüssel praktisch sofort, egal wie viele Einträge vorhanden sind. Wollen Sie Ausgaben nach Kategorien summieren, Einstellungen speichern oder einen Benutzer über seine ID schnell finden, nehmen Sie ein Dictionary. Im Folgenden finden Sie alles, was Sie für die Arbeit mit dem Python-dict brauchen: Anlegen, Methoden, Durchlaufen, Sortieren, Zusammenführen und die Neuheit aus 3.15, frozendict.
Was ein Dictionary in Python ist
Ein Dictionary speichert Paare, deren Schlüssel eindeutig ist: Schreiben Sie einen Wert unter einem vorhandenen Schlüssel, wird der alte Wert ersetzt. Intern handelt es sich um eine Hashtabelle. Deshalb laufen Suche, Hinzufügen und Löschen über einen Schlüssel im Mittel in konstanter Zeit und nicht durch Durchsuchen.
Als Schlüssel ist nur ein hashbares Objekt zulässig, etwa ein String, eine Zahl oder ein Tupel aus unveränderlichen Werten. Eine Liste kann kein Schlüssel sein, Sie erhalten dann TypeError: unhashable type: 'list'. Werte dagegen dürfen beliebig sein, auch andere Dictionaries oder Listen.
Seit Python 3.7 merkt sich ein Dictionary garantiert die Einfügereihenfolge: Beim Durchlaufen erhalten Sie die Schlüssel in der Reihenfolge, in der Sie sie hinzugefügt haben.
So legen Sie ein Dictionary an
Es gibt mehrere Wege, ein Dictionary anzulegen, alle kommen im echten Code vor.
spent = {"Essen": 1200, "Taxi": 450} # Literal
empty = {} # leeres Dictionary
also_empty = dict() # dasselbe über die Funktion dict
user = dict(name="Anna", age=30) # benannte Argumente
pairs = dict([("a", 1), ("b", 2)]) # aus einer Liste von Paaren
keys = dict.fromkeys(["x", "y"], 0) # {'x': 0, 'y': 0}
Beachten Sie: Leere geschweifte Klammern {} erzeugen ein leeres Dictionary, keine Menge. Eine leere Menge entsteht nur mit set().
Ein praktischer Weg, aus zwei Listen ein Dictionary zu bauen, ist zip:
names = ["Essen", "Taxi", "Kino"]
sums = [1200, 450, 600]
spent = dict(zip(names, sums))
print(spent) # {'Essen': 1200, 'Taxi': 450, 'Kino': 600}
Zugriff über den Schlüssel: d[k] und get
Einen Wert lesen Sie mit eckigen Klammern. Fehlt der Schlüssel, wirft Python einen KeyError. Um keinen Fehler zu bekommen, verwenden Sie die Methode get: Sie liefert None oder den angegebenen Standardwert.
spent = {"Essen": 1200}
print(spent["Essen"]) # 1200
print(spent.get("Kino")) # None
print(spent.get("Kino", 0)) # 0
spent["Kino"] # KeyError: 'Kino'
Ob ein Schlüssel vorhanden ist, prüfen Sie mit dem Operator in: "Essen" in spent liefert True. Der Operator prüft nur Schlüssel, nicht Werte. Für Werte schreiben Sie 1200 in spent.values().
Hinzufügen, Ändern und Löschen
Einen Eintrag hinzufügen oder aktualisieren Sie mit einer einzigen Zuweisung. Für Zählungen ist die Kombination mit get sehr praktisch:
spent = {}
for category, amount in [("Essen", 250), ("Taxi", 300), ("Essen", 400)]:
spent[category] = spent.get(category, 0) + amount
print(spent) # {'Essen': 650, 'Taxi': 300}
Einen Schlüssel entfernen Sie mit del d[k], das bei fehlendem Schlüssel einen KeyError auslöst, oder mit d.pop(k, default), das den Wert zusätzlich zurückgibt. Das ganze Dictionary leeren Sie mit d.clear(). Die Länge, also die Anzahl der Paare, erhalten Sie mit len(d).
Methoden von Dictionaries: Spickzettel
| Methode | Was sie macht |
|---|---|
get(k, default) | Wert zum Schlüssel oder default ohne Fehler |
setdefault(k, default) | liefert den Wert; fehlt der Schlüssel, wird zuerst default eingetragen |
update(other) | fügt Paare aus einem anderen Dictionary hinzu und überschreibt vorhandene |
pop(k, default) | entfernt den Schlüssel und liefert den Wert |
popitem() | entfernt und liefert das zuletzt hinzugefügte Paar |
keys(), values(), items() | Ansichten auf Schlüssel, Werte und Paare |
copy() | flache Kopie |
clear() | Dictionary leeren |
fromkeys(keys, value) | neues Dictionary mit demselben Wert für alle Schlüssel |
setdefault: Dictionary mit Listen füllen
Die Methode setdefault hilft, wenn die Werte Listen sind und Sie gruppieren möchten:
groups = {}
for item, cat in [("Kaffee", "Essen"), ("U-Bahn", "Verkehr"), ("Pizza", "Essen")]:
groups.setdefault(cat, []).append(item)
print(groups) # {'Essen': ['Kaffee', 'Pizza'], 'Verkehr': ['U-Bahn']}
update: Dictionary aktualisieren
update verändert das Dictionary direkt: Neue Schlüssel werden hinzugefügt, vorhandene überschrieben.
cfg = {"debug": False, "lang": "de"}
cfg.update({"debug": True, "theme": "dark"})
print(cfg) # {'debug': True, 'lang': 'de', 'theme': 'dark'}
defaultdict: Dictionary mit Standardwert
collections.defaultdict ist eine Unterklasse von dict. Greifen Sie auf einen fehlenden Schlüssel zu, erzeugt er den Wert selbst über eine Fabrikfunktion. Der Code für Zählungen und Gruppierungen wird dadurch kürzer.
from collections import defaultdict
spent = defaultdict(int)
for cat, amount in [("Essen", 250), ("Taxi", 300), ("Essen", 400)]:
spent[cat] += amount
print(dict(spent)) # {'Essen': 650, 'Taxi': 300}
groups = defaultdict(list)
groups["Essen"].append("Kaffee")
Für einfaches Zählen gibt es außerdem collections.Counter: Counter(["a", "b", "a"]) ergibt Counter({'a': 2, 'b': 1}).
Dictionary durchlaufen: for-Schleife
Durchläuft man ein Dictionary mit for, geht man standardmäßig über die Schlüssel. Um Schlüssel und Wert gleichzeitig zu erhalten, durchlaufen Sie items(). Das ist die gebräuchlichste Variante.
spent = {"Essen": 650, "Taxi": 300}
for cat in spent: # Schlüssel
print(cat)
for amount in spent.values(): # Werte
print(amount)
for cat, amount in spent.items(): # Paare
print(f"{cat}: {amount} €")
Die Größe eines Dictionaries dürfen Sie während des Durchlaufs nicht ändern, sonst erhalten Sie RuntimeError: dictionary changed size during iteration. Wenn Sie einen Teil der Schlüssel entfernen wollen, durchlaufen Sie eine Kopie: for k in list(d):.
Dictionary ausgeben
print(d) gibt das Dictionary in einer einzigen Zeile aus. Bei großen oder verschachtelten Dictionaries eignen sich das Modul pprint oder json.dumps(d, ensure_ascii=False, indent=2). Sie zeigen die Daten mit Einrückungen und ohne Escapezeichen für Umlaute an.
Dictionary sortieren
Das Dictionary selbst lässt sich nicht direkt sortieren, es hat keine Methode sort. Sortieren bedeutet hier, aus den sortierten Paaren mit sorted ein neues Dictionary zu bauen.
spent = {"Taxi": 300, "Essen": 650, "Kino": 120}
by_key = dict(sorted(spent.items()))
print(by_key) # {'Essen': 650, 'Kino': 120, 'Taxi': 300}
by_value = dict(sorted(spent.items(), key=lambda p: p[1], reverse=True))
print(by_value) # {'Essen': 650, 'Taxi': 300, 'Kino': 120}
Brauchen Sie nur die Top-N-Kategorien, wandeln Sie das Ergebnis nicht zurück in ein Dictionary: sorted(spent.items(), key=lambda p: p[1], reverse=True)[:2] liefert eine Liste von Paaren.
Eine Liste von Dictionaries nach einem Feld sortieren Sie so: sorted(users, key=lambda u: u["age"]).
Dictionaries zusammenführen
Seit Python 3.9 führt der Operator | Dictionaries zusammen, |= aktualisiert ein Dictionary direkt. Bei gleichen Schlüsseln gewinnt der rechte Operand.
a = {"x": 1, "y": 2}
b = {"y": 20, "z": 3}
print(a | b) # {'x': 1, 'y': 20, 'z': 3}
print({**a, **b}) # dasselbe über Entpacken
a |= b # wie a.update(b)
Beachten Sie: a + b funktioniert für Dictionaries nicht und ergibt einen TypeError. Wenn Sie die Werte bei gleichen Schlüsseln addieren möchten, verwenden Sie Counter: Counter(a) + Counter(b).
Dictionary entpacken
Zwei Sterne ** entpacken ein Dictionary in benannte Argumente einer Funktion oder in ein anderes Dictionary:
def greet(name, city):
return f"{name} aus {city}"
data = {"name": "Anna", "city": "Hamburg"}
print(greet(**data)) # Anna aus Hamburg
Dictionary-Comprehension
Eine Dictionary-Comprehension erzeugt ein Dictionary in einer Zeile aus einer beliebigen Folge:
squares = {n: n * n for n in range(5)}
print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
big = {k: v for k, v in spent.items() if v > 200}
inverted = {v: k for k, v in {"a": 1, "b": 2}.items()}
print(inverted) # {1: 'a', 2: 'b'}
Das letzte Beispiel zeigt, wie man ein Dictionary umdreht, indem man Schlüssel und Werte vertauscht. Das funktioniert nur, wenn die Werte eindeutig und hashbar sind. Andernfalls gehen Paare verloren.
Verschachtelte Dictionaries
Ein Wert kann wiederum ein Dictionary sein. So beschreibt man Strukturen wie JSON-Antworten einer API oder ein Dictionary von Benutzern.
users = {
101: {"name": "Anna", "skills": ["python", "sql"]},
102: {"name": "Olaf", "skills": ["go"]},
}
print(users[101]["skills"][0]) # python
print(users.get(103, {}).get("name")) # None, ohne KeyError
Dictionary kopieren: Kopie oder zweiter Name
Die Zuweisung b = a kopiert kein Dictionary, sondern gibt demselben Objekt einen zweiten Namen. Ändern Sie es über b, sehen Sie die Änderung auch in a. Dasselbe geschieht, wenn Sie ein Dictionary an eine Funktion übergeben: Sie erhält einen Verweis auf das gemeinsame Objekt und kann es unbemerkt verändern.
import copy
a = {"limits": [0, 500]}
b = a.copy() # flache Kopie
b["limits"].append(1000) # die verschachtelte Liste ist gemeinsam!
print(a) # {'limits': [0, 500, 1000]}
c = copy.deepcopy(a) # vollständig unabhängige Kopie
Dictionaries vergleichen
Der Operator == vergleicht Dictionaries nach ihrem Inhalt: Sie sind gleich, wenn alle Paare übereinstimmen. Die Reihenfolge der Schlüssel spielt dabei keine Rolle: {"a": 1, "b": 2} == {"b": 2, "a": 1} ergibt True. Um gemeinsame Schlüssel zu finden, verwenden Sie Mengenoperationen auf den Ansichten: a.keys() & b.keys().
Typisierte Dictionaries: Annotationen
Die Annotation eines Dictionaries schreibt man als dict[str, int]. Hat ein Dictionary eine feste Menge von Feldern mit unterschiedlichen Typen, eignet sich TypedDict aus dem Modul typing:
from typing import TypedDict
class User(TypedDict):
name: str
age: int
u: User = {"name": "Anna", "age": 30}
Annotationen werden zur Laufzeit nicht geprüft. Sie werden von IDEs und Analysewerkzeugen wie mypy gelesen.
Unveränderliches Dictionary: frozendict in Python 3.15
In Python 3.15 kam der eingebaute Typ frozendict hinzu (PEP 814). Er braucht keinen Import, und ein Änderungsversuch führt sofort zu einem TypeError. Bisher musste man ein unveränderliches Dictionary mit einer Hülle aus dem Modul types oder mit einem Drittpaket nachbilden. Genau das braucht man für gemeinsame Einstellungen, die keine Funktion stillschweigend ändern darf.
config = frozendict(min_amount=0, max_amount=500)
config["max_amount"] = 1000
# TypeError: 'frozendict' object does not support item assignment
strict = config | {"max_amount": 300} # neues frozendict, das Original bleibt
cache = {config: "Bericht für Mai"} # hashbar — also als Schlüssel geeignet
Was Sie nach dem Material des Kurses wissen sollten:
frozendicterbt vonobjectund nicht vondict. Deshalb liefertisinstance(cfg, dict)den WertFalse. Um „irgendein Dictionary“ zu prüfen, verwenden Siecollections.abc.Mappingoderisinstance(x, (dict, frozendict)).- Er ist nur hashbar, wenn Schlüssel und Werte hashbar sind:
frozendict(a=[1])lässt sich anlegen, aberhash()schlägt fehl. Die Unveränderlichkeit ist flach, wie beim Tupel. - Die Reihenfolge wird gespeichert,
==berücksichtigt sie aber nicht. json.dumps,pickleundcopyverarbeiten frozendict.
Typische Fehler
- KeyError beim Lesen — verwenden Sie
getoder eine Prüfung mitin. - Liste als Schlüssel — wandeln Sie sie in ein Tupel um:
d[tuple(lst)]. - Dictionary während der Schleife ändern — durchlaufen Sie
list(d). - Erwartung einer Kopie bei einer Zuweisung — verwenden Sie
copy()oderdeepcopy. {}statt einer leeren Menge — das ist ein leeres Dictionary.
Fazit
Das dict in Python ist die wichtigste Datenstruktur der Sprache: schneller Zugriff über den Schlüssel, erhaltene Einfügereihenfolge, praktische Methoden wie get, setdefault und update, Durchlauf über items(), Sortierung mit sorted und das Zusammenführen mit dem Operator |. Achten Sie auf das Kopieren und die hashbaren Schlüssel, und für Einstellungen in Python 3.15 nehmen Sie frozendict. Dictionaries, Listen, Tupel und Mengen werden im Kurs „Python 3.15: vom Einsteiger zum Profi“ am Beispiel des Ausgabentrackers praktisch durchgespielt.
Häufige Fragen
Kann ein Dictionary Werte verschiedener Typen speichern?
Ja, die Werte dürfen beliebig und untereinander verschieden sein: Zahlen, Strings, Listen, andere Dictionaries. Eine Einschränkung gibt es nur für die Schlüssel, sie müssen hashbar sein.
Wie ermittle ich die Anzahl der Elemente in einem Dictionary?
Die Funktion len(d) liefert die Anzahl der Paare. Für ein leeres Dictionary ergibt sie 0, und das leere Dictionary ist in einer if-Bedingung falsch.
Worin unterscheidet sich dict von defaultdict?
defaultdict ist eine Unterklasse von dict. Beim Zugriff auf einen fehlenden Schlüssel löst er keinen KeyError aus, sondern erzeugt den Wert über eine Fabrik, etwa int oder list. Ansonsten verhält er sich wie ein gewöhnliches Dictionary.
Wie finde ich einen Schlüssel anhand seines Wertes?
Eine direkte Methode gibt es nicht, Sie brauchen eine Durchsuchung: next((k for k, v in d.items() if v == value), None). Wird das oft benötigt, ist ein umgekehrtes Dictionary per Comprehension {v: k for k, v in d.items()} einfacher.
Wie speichere ich ein Dictionary in einer Datei?
Meist über das Modul json: json.dump(d, f, ensure_ascii=False, indent=2) schreibt in eine zum Schreiben geöffnete Datei, json.load(f) liest sie. Die Schlüssel werden dabei zu Strings.
Dieses Thema wird im Kurs „Python 3.15: от новичка до профи“ ausführlich mit Praxis behandelt.
Zum Kurs