Wie und wann sollten Sie Defaultdict in Python verwenden?

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 KeyErrors 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 KeyErrors auftreten. Hierfür gibt es verschiedene Lösungsansätze.

In diesem Tutorial lernen Sie:

  • Was KeyErrors sind und warum sie entstehen.
  • Verschiedene Methoden zur Behandlung von KeyErrors.
  • Wie Sie defaultdict, eine Unterklasse von dict, verwenden, um fehlende Schlüssel eleganter zu verwalten.

Legen wir los!

Was sind KeyErrors 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 KeyErrors in Python behandeln?

Es gibt mehrere Möglichkeiten, die wir uns im nächsten Abschnitt ansehen werden.

Behandlung von KeyErrors in Python

Lassen Sie uns die verschiedenen Methoden zur Behandlung von KeyErrors kennenlernen:

  • if-else-Bedingungen
  • try-except-Blöcke
  • Die get()-Methode des Dictionaries

#1. Verwendung von if-else-Bedingungen

Eine einfache Methode zur Behandlung von KeyErrors 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 KeyErrors 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 im except-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, gibt get() die zugehörigen Werte zurück.
  • Für nicht existierende Schlüssel ('Grit' und 'Make Time') gibt get() den Standardwert „Existiert nicht“ zurück.
# Ausgabe

Existiert nicht
Chris Bailey
Existiert nicht
Cal Newport
    

Alle oben genannten Methoden helfen bei der Behandlung von KeyErrors. 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 KeyErrors auf.
  • Sie können KeyErrors mit bedingten Anweisungen, try-except-Blöcken oder der get()-Methode behandeln, aber defaultdict aus dem Modul collections vereinfacht die Handhabung.
  • Sie verwenden defaultdict(default_factory), wobei default_factory ein gültiges aufrufbares Objekt ist.
  • Wenn ein Schlüssel in defaultdict nicht existiert, werden der Standardwert (abgeleitet von default_factory) und der Schlüssel zu defaultdict hinzugefügt.

Schauen Sie sich als Nächstes das Tutorial zur Python-Funktion map() an.