Einführung
Dictionaries in Python sind vielseitige Werkzeuge, die in vielen Anwendungen von Konfigurationen über JSON-Daten bis hin zu API-Antworten eingesetzt werden. Während viele Anfänger lediglich die Grundlagen wie das Erstellen eines Dictionaries, den Zugriff auf einen Schlüssel und das Aktualisieren eines Wertes erlernen, gibt es weit mehr zu entdecken. In diesem Artikel werden sieben Tipps vorgestellt, die dazu beitragen, den Code klarer und pythonischer zu gestalten.
Verwendung von .get() anstelle von [] für den Zugriff
Wenn Sie mit einem Dictionary arbeiten und auf einen Wert zugreifen möchten, stellt sich die Frage: Was passiert, wenn der Schlüssel nicht vorhanden ist? Angenommen, Sie haben ein Konfigurations-Dictionary und versuchen, den Schlüssel „timeout“ wie folgt auszugeben:
config = {"debug": True, "verbose": False}
print(config["timeout"])
Dies führt zu einem Fehler:
KeyError: 'timeout'
Um dies zu vermeiden, sollten Sie die Methode .get() verwenden. Diese ist sicherer und ermöglicht es Ihnen, einen Standardwert festzulegen, falls der Schlüssel fehlt:
config = {"debug": True, "verbose": False}
print(config.get("timeout", 30))
Das Ergebnis wird 30 sein, was der von uns festgelegte Standardwert ist. Wenn das Fehlen eines Schlüssels jedoch ein Fehler ist, sollten Sie die eckigen Klammern verwenden, um den Fehler sofort anzuzeigen.
Verwendung von defaultdict zur Gruppierung von Daten
Wenn Sie eine Liste von Wörtern haben und zählen möchten, wie oft jedes Wort erscheint, könnte Ihr Code so aussehen:
words = ["apple", "banana", "apple", "cherry", "banana", "banana"]
counts = {}
for word in words:
if word not in counts:
counts[word] = 0
counts[word] += 1
print(counts)
Obwohl dieser Ansatz funktioniert, ist er etwas umständlich. Mit Python’s defaultdict wird der Code klarer:
from collections import defaultdict
words = ["apple", "banana", "apple", "cherry", "banana", "banana"]
counts = defaultdict(int)
for word in words:
counts[word] += 1
print(counts)
Das Ergebnis zeigt, dass Python automatisch einen Standardwert von 0 erstellt, wenn auf einen fehlenden Schlüssel zugegriffen wird.
Dictionaries mit dem | Operator zusammenführen
In der modernen Python-Version ist der sauberste Weg, Dictionaries zusammenzuführen, der | Operator:
defaults = {"color": "blue", "size": "medium"}
overrides = {"size": "large", "weight": "heavy"}
merged = defaults | overrides
print(merged)
Das Ergebnis zeigt, dass bei überlappenden Schlüsseln das Dictionary auf der rechten Seite gewinnt:
{'color': 'blue', 'size': 'large', 'weight': 'heavy'}
Für eine In-Place-Zusammenführung können Sie den |= Operator verwenden:
defaults |= overrides
print(defaults)
Das Ergebnis bleibt dasselbe.
Dictionaries in Funktionsargumente entpacken
Wenn Sie eine Funktion und ein Dictionary haben, deren Felder oder Schlüssel übereinstimmen, können Sie anstelle der Einzelübergabe der Schlüssel alles mit dem **-Operator übergeben. Hier ein Beispiel:
def create_user(name, age, role="viewer"):
return {"name": name, "age": age, "role": role}
user_data = {
"name": "David",
"age": 33
}
Die normale Methode würde so aussehen:
user = create_user(
name=user_data["name"],
age=user_data["age"],
role=user_data["role"]
)
print(user)
Das Ergebnis zeigt:
{'name': 'David', 'age': 33, 'role': 'viewer'}
Mit dem **-Operator können Sie jedoch den Code vereinfachen:
print(create_user(**user_data))
Das Ergebnis bleibt gleich, jedoch wird der Code dadurch klarer und robuster.
Verwendung des Walross-Operators mit Dictionaries
Python 3.8 führte den Walross-Operator (:=) ein, der es ermöglicht, einen Wert im Rahmen eines Ausdrucks zuzuweisen. Dies ist besonders nützlich bei der Arbeit mit Dictionaries:
data = {
"user": {
"name": "Bryan",
"email": "bryan@gmail.com"
}
}
if data.get("user") is not None:
user = data.get("user")
name = user.get("name")
print(name)
Obwohl dieser Ansatz funktioniert, wiederholt er die gleiche Nachschlageoperation mehrmals. Mit dem Walross-Operator können Sie dies in einem Schritt erledigen:
if (user := data.get("user")) is not None:
name = user.get("name")
print(name)
Das Ergebnis bleibt gleich und ist besonders hilfreich bei verschachtelten Dictionary-Strukturen.
TypedDict für strukturierte Daten verwenden
Dictionaries sind flexibel, aber diese Flexibilität kann manchmal problematisch sein. Zum Beispiel:
def greet(user):
return f"Hello, {user['name']}!"
user = {
"name": "Clair",
"age": "thirty"
}
print(greet(user))
Obwohl dies zur Laufzeit funktioniert, gibt es ein verstecktes Problem: „age“ sollte eine Zahl und kein String sein. Python selbst wird nicht warnen, was später in größeren Projekten zu Fehlern führen kann. TypedDict macht die erwartete Dictionary-Struktur explizit:
from typing import TypedDict
class UserProfile(TypedDict):
name: str
age: int
def greet(user: UserProfile) -> str:
return f"Hello, {user['name']}!"
user: UserProfile = {
"name": "Clair",
"age": "thirty",
}
print(greet(user))
Das Ergebnis zeigt einen Typfehler, der von Tools wie mypy erkannt wird, bevor der Code ausgeführt wird.
Einfaches Iterieren: .items(), .keys(), .values()
Python-Dictionaries bieten viele eingebaute Methoden für die Iteration: .items(), .keys() und .values(). Viele Entwickler sind sich dieser Methoden bewusst, nutzen sie jedoch nicht so oft, wie sie sollten. Ein typischer Loop könnte so aussehen:
scores = {
"David": 92,
"Bryan": 87,
"Clair": 95
}
for name in scores:
print(name, scores[name])
Obwohl dies funktioniert, ist es nicht die beste Methode, da bei jedem Durchlauf eine zusätzliche Nachschlageoperation durchgeführt wird. Die Verwendung von .items() ist klarer:
for name, score in scores.items():
print(name, score)
Das Ergebnis zeigt beide Werte zusammen und vermeidet wiederholte Nachschläge, was den Code lesbarer macht. Wenn Sie nur die Schlüssel benötigen, verwenden Sie .keys(). Wenn Sie nur die Werte benötigen, verwenden Sie .values().
Fazit
Python-Dictionaries erscheinen auf den ersten Blick einfach, aber das Erlernen einiger wichtiger Muster kann Ihren Code erheblich verbessern. Funktionen wie .get(), defaultdict, Entpacken und TypedDict helfen, wiederholten Code zu reduzieren und Ihre Programme zuverlässiger zu gestalten. Wenn Sie mehr über die Optimierung von KI-Agenten erfahren möchten, werfen Sie einen Blick auf Fünf effektive Python-Dekoratoren zur Optimierung von KI-Agenten. Für die Automatisierung der explorativen Datenanalyse sind effiziente Python-Skripte sehr hilfreich. Außerdem können Sie sich über effektive Merkmalsauswahl informieren.
„`
Quellen: kdnuggets
Bildquelle: KI generiert
🚀