Dictionaries durchlaufen
Alle Methoden zum Durchlaufen von Python-Dictionaries: Schlüssel, Werte, items(), Filterung, Comprehensions und sichere Änderungen während der Schleife.
Python-Dictionaries speichern Daten als Schlüssel-Wert-Paare, und es ist häufig erforderlich, sie zu durchlaufen — um jeden Eintrag auszugeben, Daten zu filtern, Werte zu transformieren oder neue Strukturen zu erstellen. Dieses Kapitel behandelt alle gängigen Techniken zum Iterieren über ein Dictionary, erklärt, welche Methode in welcher Situation geeignet ist, und beleuchtet den häufigsten Fehler: ein Dictionary zu ändern, während man es durchläuft.
Wenn Sie neu bei Dictionaries sind, lesen Sie zunächst Python Dictionaries. Zur allgemeinen Schleifensyntax siehe Python For Loops.
Über Schlüssel iterieren
Wenn Sie eine einfache for-Schleife auf ein Dictionary anwenden, iteriert Python standardmäßig über seine Schlüssel.
Über Dictionary-Schlüssel iterieren
person = {"name": "Alice", "age": 30, "city": "Berlin"}
for key in person:
print(key)Ausgabe:
name
age
cityDer Aufruf von .keys() ist gleichwertig und macht die Absicht deutlicher:
Sobald Sie den Schlüssel haben, können Sie seinen Wert innerhalb der Schleife nachschlagen:
person = {"name": "Alice", "age": 30, "city": "Berlin"}
for key in person:
print(key, "->", person[key])Ausgabe:
name -> Alice
age -> 30
city -> BerlinWann sollte man .keys() verwenden?
Verwenden Sie die einfache Form for key in d, wenn Sie nur Schlüssel benötigen. Verwenden Sie d.keys() explizit, wenn Sie die Zugehörigkeit testen ("name" in d.keys()) oder die Ansicht an eine andere Funktion übergeben möchten. Für einen einfachen Zugehörigkeitstest ist jedoch if "name" in d schneller.
Über Werte iterieren
Verwenden Sie .values(), wenn Sie nur die Werte benötigen und sich nicht um die Schlüssel kümmern.
Über Dictionary-Werte iterieren
scores = {"math": 92, "science": 87, "english": 95}
for score in scores.values():
print(score)Ausgabe:
92
87
95Ein häufiger Anwendungsfall ist die Berechnung einer Zusammenfassung über alle Werte:
scores = {"math": 92, "science": 87, "english": 95}
total = sum(scores.values())
average = total / len(scores)
print(f"Average score: {average:.1f}")Ausgabe:
Average score: 91.3Über Schlüssel-Wert-Paare mit .items() iterieren
.items() gibt jeden Eintrag als (key, value)-Tuple zurück. Sie können das Tuple direkt in zwei Variablen entpacken. Dies ist die vielseitigste Iterationsmethode und die, die Sie am häufigsten verwenden werden.
Über Schlüssel-Wert-Paare iterieren
person = {"name": "Alice", "age": 30, "city": "Berlin"}
for key, value in person.items():
print(f"{key}: {value}")Ausgabe:
name: Alice
age: 30
city: BerlinFiltern beim Durchlaufen
Kombinieren Sie eine for-Schleife mit einer if-Bedingung, um nur die gewünschten Einträge zu verarbeiten.
Nur vorrätige Artikel ausgeben
inventory = {"apples": 5, "bananas": 0, "oranges": 3, "grapes": 0}
print("In stock:")
for item, qty in inventory.items():
if qty > 0:
print(f" {item}: {qty}")Ausgabe:
In stock:
apples: 5
oranges: 3Dictionary-Einträge sortieren
Python 3.7+ garantiert, dass Dictionaries die Einfügungsreihenfolge beibehalten. Wenn Sie eine andere Reihenfolge benötigen, sortieren Sie die Schlüssel oder Einträge vor dem Durchlaufen — das Dictionary selbst wird dabei nicht verändert.
Nach Schlüssel sortieren (alphabetisch)
book = {"banana": 7, "apple": 3, "cherry": 12}
for fruit in sorted(book):
print(f"{fruit}: {book[fruit]}")Ausgabe:
apple: 3
banana: 7
cherry: 12Nach Wert sortieren
Übergeben Sie eine key-Funktion an sorted(), um das Sortierkriterium zu steuern.
book = {"banana": 7, "apple": 3, "cherry": 12}
for fruit, count in sorted(book.items(), key=lambda item: item[1], reverse=True):
print(f"{fruit}: {count}")Ausgabe:
cherry: 12
banana: 7
apple: 3enumerate() beim Durchlaufen verwenden
Umschließen Sie .items() mit enumerate(), um neben jedem Schlüssel-Wert-Paar einen laufenden Index zu erhalten.
colors = {"red": "#FF0000", "green": "#00FF00", "blue": "#0000FF"}
for index, (name, hex_code) in enumerate(colors.items()):
print(f"{index}: {name} -> {hex_code}")Ausgabe:
0: red -> #FF0000
1: green -> #00FF00
2: blue -> #0000FFDictionary-Comprehensions
Eine Dictionary-Comprehension erstellt in einem einzigen Ausdruck ein neues Dictionary aus einem bestehenden. Die Syntax ähnelt List-Comprehensions, verwendet jedoch geschweifte Klammern und einen Doppelpunkt zwischen Schlüssel und Wert.
Auf jeden Preis 10 % Rabatt anwenden
prices = {"apple": 1.20, "banana": 0.50, "orange": 0.80}
discounted = {item: round(price * 0.9, 2) for item, price in prices.items()}
print(discounted)Ausgabe:
{'apple': 1.08, 'banana': 0.45, 'orange': 0.72}Am Ende kann eine Filterbedingung hinzugefügt werden:
Nur Schüler mit 90 Punkten oder mehr behalten
students = {
"Alice": {"grade": "A", "score": 95},
"Bob": {"grade": "B", "score": 82},
"Carol": {"grade": "A", "score": 91},
}
top_students = {name: info for name, info in students.items() if info["score"] >= 90}
print(top_students)Ausgabe:
{'Alice': {'grade': 'A', 'score': 95}, 'Carol': {'grade': 'A', 'score': 91}}Über verschachtelte Dictionaries iterieren
Wenn Werte selbst Dictionaries sind (siehe Nested Dictionaries), greifen Sie mit einem zweiten Index oder einer zweiten Schleife auf die inneren Einträge zu.
Alle Felder für jeden Schüler ausgeben
students = {
"Alice": {"grade": "A", "score": 95},
"Bob": {"grade": "B", "score": 82},
"Carol": {"grade": "A", "score": 91},
}
for name, info in students.items():
print(f"{name}: grade={info['grade']}, score={info['score']}")Ausgabe:
Alice: grade=A, score=95
Bob: grade=B, score=82
Carol: grade=A, score=91Ein Dictionary beim Durchlaufen ändern — die wichtigste Falle
Sie können einem Dictionary während der Iteration keine Schlüssel hinzufügen oder entfernen. Python wirft sofort einen RuntimeError:
d = {"a": 1, "b": 2, "c": 3}
# This raises RuntimeError: dictionary changed size during iteration
for key in d:
if d[key] == 2:
del d[key]Das sichere Muster besteht darin, zuerst die zu entfernenden Schlüssel zu sammeln und sie erst nach der Schleife zu löschen:
Sicheres Löschen nach dem Durchlaufen
config = {"debug": True, "verbose": True, "timeout": 30}
keys_to_remove = [k for k, v in config.items() if v is True]
for k in keys_to_remove:
del config[k]
print(config)Ausgabe:
{'timeout': 30}Dasselbe Prinzip gilt für das Hinzufügen von Schlüsseln: Sammeln Sie die neuen Paare und aktualisieren Sie das Dictionary anschließend mit update() oder einer direkten Zuweisung nach der Schleife.
Die richtige Methode wählen
| Ziel | Methode |
|---|---|
| Nur über Schlüssel iterieren | for key in d oder for key in d.keys() |
| Nur über Werte iterieren | for value in d.values() |
| Über beides iterieren | for key, value in d.items() |
| Ein neues Dictionary erstellen | Dictionary-Comprehension |
| Einträge sortieren | sorted(d) oder sorted(d.items(), key=...) |
| Index + Schlüssel-Wert | enumerate(d.items()) |
Für den vollständigen Satz an Dictionary-Operationen siehe Python Dictionary Methods und Copy Dictionaries.