Verwendung von defaultdict zur besseren Fehlerbehandlung bei Python-Dictionaries
Dieses Tutorial zeigt Ihnen, wie Sie defaultdict
aus dem Python-Modul collections
nutzen können, um KeyError
s effektiver zu behandeln, wenn Sie mit Dictionaries arbeiten.
Ein Dictionary ist eine vielseitige Datenstruktur in Python, die Daten als Schlüssel-Wert-Paare speichert. Sie verwenden die Schlüssel, um auf die entsprechenden Werte zuzugreifen.
Bei der Arbeit mit mehreren Dictionaries, die während der Programmausführung verändert werden, können jedoch häufig KeyError
s auftreten. Hierfür gibt es verschiedene Lösungsansätze.
In diesem Tutorial lernen Sie:
- Was
KeyError
s sind und warum sie entstehen. - Verschiedene Methoden zur Behandlung von
KeyError
s. - Wie Sie
defaultdict
, eine Unterklasse vondict
, verwenden, um fehlende Schlüssel eleganter zu verwalten.
Legen wir los!
Was sind KeyError
s in Python?
Beim Erstellen eines Python-Dictionaries gibt es zwei wichtige Aspekte:
- Schlüssel müssen eindeutig sein (keine Duplikate).
- Wenn Sie eine bestehende Iterable als Schlüssel verwenden, sollten Sie unveränderliche Datentypen wie Tupel bevorzugen.
Ein Schlüssel ist nur dann gültig, wenn er im Dictionary vorhanden ist; andernfalls resultiert dies in einem KeyError
.
Betrachten Sie das Dictionary books_authors
, in dem Buchnamen als Schlüssel und Autorennamen als Werte dienen.
Sie können den Code dieses Tutorials in einer Python-REPL selbst ausprobieren.
books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
Sie können auf den Autorennamen zugreifen, indem Sie den Buchnamen als Schlüssel verwenden:
books_authors['Hyperfocus'] 'Chris Bailey'
Um alle Schlüssel-Wert-Paare auszugeben, können Sie die Methode items()
nutzen:
for book,author in books_authors.items(): print(f"'{book}' von {author}")
'Deep Work' von Cal Newport 'Hyperfocus' von Chris Bailey 'Pivot' von Jenny Blake 'The Happiness Equation' von Neil Pasricha
Wenn Sie versuchen, auf einen Wert mit einem nicht existierenden Schlüssel zuzugreifen, löst der Python-Interpreter einen KeyError
aus. Dies geschieht zum Beispiel bei den Schlüsseln 'Grit'
und 'nicht-existenter-schlüssel'
.
books_authors['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
books_authors['nicht-existenter-schlüssel']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['nicht-existenter-schlüssel'] KeyError: 'nicht-existenter-schlüssel'
Wie können Sie also KeyError
s in Python behandeln?
Es gibt mehrere Möglichkeiten, die wir uns im nächsten Abschnitt ansehen werden.
Behandlung von KeyError
s in Python
Lassen Sie uns die verschiedenen Methoden zur Behandlung von KeyError
s kennenlernen:
if-else
-Bedingungentry-except
-Blöcke- Die
get()
-Methode des Dictionaries
#1. Verwendung von if-else
-Bedingungen
Eine einfache Methode zur Behandlung von KeyError
s ist die Verwendung von if-else
-Bedingungen.
Die allgemeine Syntax einer if-else
-Anweisung in Python lautet:
if Bedingung: # tue dies else: # tue etwas anderes
- Wenn die Bedingung wahr ist, werden die Anweisungen im
if
-Block ausgeführt. - Wenn die Bedingung falsch ist, werden die Anweisungen im
else
-Block ausgeführt.
In diesem Beispiel prüfen wir, ob ein Schlüssel im Dictionary vorhanden ist.
Wenn der Schlüssel vorhanden ist, gibt der in
-Operator True
zurück, und der entsprechende Wert wird ausgegeben.
key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Entschuldigung, dieser Schlüssel existiert nicht!') # Ausgabe # Neil Pasricha
Wenn der Schlüssel nicht vorhanden ist, gibt der in
-Operator False
zurück, und der else
-Block wird ausgeführt. Es wird eine Meldung ausgegeben, dass der Schlüssel nicht existiert.
key = 'nicht-existenter-schlüssel' if key in books_authors: print(books_authors[key]) else: print('Entschuldigung, dieser Schlüssel existiert nicht!') # Ausgabe # Entschuldigung, dieser Schlüssel existiert nicht!
#2. Verwendung von try-except
-Anweisungen
Eine weitere häufig verwendete Methode zur Behandlung von KeyError
s ist die Verwendung von try-except
-Anweisungen.
Betrachten Sie folgenden Codeblock:
key = 'nicht-existenter-schlüssel' try: print(books_authors[key]) except KeyError: print('Entschuldigung, dieser Schlüssel existiert nicht!')
- Der
try
-Block versucht, den Wert für den angegebenen Schlüssel abzurufen. - Wenn der Schlüssel nicht vorhanden ist, wird ein
KeyError
ausgelöst, der imexcept
-Block abgefangen wird.
#3. Verwendung der get()
-Methode
Python bietet die integrierte Dictionary-Methode get()
, um fehlende Schlüssel zu handhaben.
Die allgemeine Syntax lautet: dict.get(key, default_value)
, wobei dict
ein gültiges Dictionary-Objekt ist.
- Wenn der Schlüssel existiert, gibt
get()
den zugehörigen Wert zurück. - Andernfalls wird der Standardwert zurückgegeben.
In diesem Beispiel ist keys
eine Liste von Schlüsseln, auf deren Werte wir zugreifen möchten. Wir iterieren über die Liste, um die Werte aus dem Dictionary books_authors
abzurufen.
Hier verwenden wir die get()
-Methode mit „Existiert nicht“ als Standardwert.
keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Existiert nicht'))
In diesem Code:
- Für Schlüssel, die in
books_authors
vorhanden sind, gibtget()
die zugehörigen Werte zurück. - Für nicht existierende Schlüssel (
'Grit'
und'Make Time'
) gibtget()
den Standardwert „Existiert nicht“ zurück.
# Ausgabe Existiert nicht Chris Bailey Existiert nicht Cal Newport
Alle oben genannten Methoden helfen bei der Behandlung von KeyError
s. Sie sind jedoch ausführlich und erfordern eine explizite Behandlung. Mit defaultdict
lässt sich dies einfacher gestalten.
defaultdict
in Python
defaultdict
ist eine Unterklasse von dict
und erbt dessen Verhalten, behandelt aber fehlende Schlüssel auf besondere Weise.
defaultdict
ist ein Container-Datentyp in der Python-Standardbibliothek (im Modul collections
).
Sie müssen es daher importieren:
from collections import defaultdict
Die allgemeine Syntax lautet:
defaultdict(default_factory)
Sie können ein aufrufbares Objekt (wie int
, float
oder list
) als default_factory
angeben. Wenn kein Wert für default_factory
angegeben wird, ist dieser standardmäßig None
.
Wenn ein gesuchter Schlüssel nicht existiert, wird die Methode __missing__()
aufgerufen und der Standardwert aus default_factory
abgeleitet und zurückgegeben.
Zusammenfassend:
defaultdict
gibt einen Standardwert zurück, wenn ein Schlüssel nicht existiert.- Zudem wird dieses Schlüssel-Standardwert-Paar zum Dictionary hinzugefügt, was Sie später ändern können.
Beispiele für defaultdict
Betrachten wir nun einige Beispiele, um die Funktionsweise von defaultdict
zu verstehen.
defaultdict
mit ganzzahligem Standardwert
Importieren Sie zuerst defaultdict
aus dem collections
-Modul.
from collections import defaultdict import random
Erstellen wir ein Dictionary für Preise.
prices = defaultdict(int)
Füllen wir nun das Dictionary mit Obstnamen als Schlüssel und zufälligen Preisen als Werte.
price_list = [10,23,12,19,5] fruits = ['apfel','erdbeere','granatapfel','blaubeere'] for fruit in fruits: prices[fruit] = random.choice(price_list)
Sehen wir uns die Schlüssel-Wert-Paare an.
print(prices.items())
dict_items([('apfel', 12), ('blaubeere', 19), ('granatapfel', 5), ('erdbeere', 10)])
Wie bei normalen Dictionaries können Sie über die Schlüssel auf die Werte zugreifen:
prices['apfel'] # 23
Versuchen wir, den Preis einer nicht existierenden Frucht (z. B. „orange“) abzurufen. Es wird der Standardwert 0 zurückgegeben.
prices['orange'] # 0
Wenn wir das Dictionary ausgeben, sehen wir, dass der neue Schlüssel „orange“ mit dem Standardwert 0 hinzugefügt wurde.
print(prices.items())
dict_items([('apfel', 12), ('blaubeere', 19), ('granatapfel', 5), ('erdbeere', 10), ('orange', 0)])
defaultdict
mit Listen als Standardwert
Definieren wir students_majors
als defaultdict
von Listen. Die Studiengänge sind die Schlüssel, die Werte sind Listen von Studenten.
from collections import defaultdict students_majors = defaultdict(list)
Wenn wir versuchen, auf die Liste der Studierenden in Wirtschaft zuzugreifen, gibt defaultdict
eine leere Liste zurück. Kein KeyError
!
students_majors['Wirtschaft'] # []
Wir haben nun eine leere Liste für den Studiengang Wirtschaft. Dieser Liste können wir nun Elemente hinzufügen:
students_majors['Wirtschaft'].append('Alex')
Im Dictionary students_majors
wurde ein Eintrag für Wirtschaft erstellt:
print(students_majors)
defaultdict(<class 'list'>, {'Wirtschaft': ['Alex']})
Sie können weitere Studenten hinzufügen, neue Studiengänge anlegen und vieles mehr!
students_majors['Wirtschaft'].append('Bob') students_majors['Mathematik'].append('Laura') print(students_majors)
defaultdict(<class 'list'>, {'Wirtschaft': ['Alex', 'Bob'], 'Mathematik': ['Laura']})
Fazit
Ich hoffe, dieses Tutorial hat Ihnen geholfen, die Verwendung von defaultdict
in Python zu verstehen. Nach dem Durcharbeiten der Codebeispiele sollten Sie defaultdict
als bevorzugte Datenstruktur in Ihren Projekten einsetzen.
Zusammenfassend haben Sie Folgendes gelernt:
- Bei der Arbeit mit Dictionaries treten häufig
KeyError
s auf. - Sie können
KeyError
s mit bedingten Anweisungen,try-except
-Blöcken oder derget()
-Methode behandeln, aberdefaultdict
aus dem Modulcollections
vereinfacht die Handhabung. - Sie verwenden
defaultdict(default_factory)
, wobeidefault_factory
ein gültiges aufrufbares Objekt ist. - Wenn ein Schlüssel in
defaultdict
nicht existiert, werden der Standardwert (abgeleitet vondefault_factory
) und der Schlüssel zudefaultdict
hinzugefügt.
Schauen Sie sich als Nächstes das Tutorial zur Python-Funktion map()
an.