In diesem Tutorial werden wir die Datenstruktur defaultdict in Python untersuchen, die eine leistungsstarke Variation des standardmäßigen Wörterbuchs ist und fehlende Schlüssel elegant behandelt. Insbesondere werden wir lernen, wie man einen defaultdict mit einem Standardwert von 0 erstellt, was besonders nützlich ist, um Werte in Python-Programmen zu zählen und zu akkumulieren.
Am Ende dieses Labors werden Sie verstehen, was ein defaultdict ist, wie man einen mit einem Standardwert von 0 erstellt und wie man es in praktischen Szenarien anwendet, um eleganteres und fehlerresistenteren Code zu schreiben.
Skills Graph
%%%%{init: {'theme':'neutral'}}%%%%
flowchart RL
python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"])
python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"])
python(("Python")) -.-> python/FunctionsGroup(["Functions"])
python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"])
python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements")
python/DataStructuresGroup -.-> python/dictionaries("Dictionaries")
python/FunctionsGroup -.-> python/function_definition("Function Definition")
python/FunctionsGroup -.-> python/default_arguments("Default Arguments")
python/PythonStandardLibraryGroup -.-> python/data_collections("Data Collections")
subgraph Lab Skills
python/conditional_statements -.-> lab-397967{{"Wie man in Python ein defaultdict mit einem Standardwert von 0 erstellt"}}
python/dictionaries -.-> lab-397967{{"Wie man in Python ein defaultdict mit einem Standardwert von 0 erstellt"}}
python/function_definition -.-> lab-397967{{"Wie man in Python ein defaultdict mit einem Standardwert von 0 erstellt"}}
python/default_arguments -.-> lab-397967{{"Wie man in Python ein defaultdict mit einem Standardwert von 0 erstellt"}}
python/data_collections -.-> lab-397967{{"Wie man in Python ein defaultdict mit einem Standardwert von 0 erstellt"}}
end
Das Problem mit regulären Wörterbüchern verstehen
Bevor wir uns mit defaultdict befassen, sollen wir zunächst die Einschränkung von regulären Wörterbüchern verstehen, die defaultdict uns hilft zu lösen.
Das KeyError-Problem
In Python wird das standardmäßige Wörterbuch (dict) verwendet, um Schlüssel-Wert-Paare zu speichern. Wenn Sie jedoch versuchen, einen Schlüssel zuzugreifen, der in einem regulären Wörterbuch nicht existiert, wird von Python ein KeyError ausgelöst.
Lassen Sie uns ein einfaches Beispiel erstellen, um dieses Problem zu demonstrieren:
Erstellen Sie in Ihrem Editor eine neue Datei namens regular_dict_demo.py:
## Erstellen Sie ein reguläres Wörterbuch, um die Anzahl von Früchten zu zählen
fruit_counts = {}
## Versuchen Sie, die Anzahl von 'apfel' zu erhöhen
try:
fruit_counts['apfel'] += 1
except KeyError:
print("KeyError: Der Schlüssel 'apfel' existiert nicht im Wörterbuch")
## Die richtige Vorgehensweise mit regulären Wörterbüchern
if 'banane' in fruit_counts:
fruit_counts['banane'] += 1
else:
fruit_counts['banane'] = 1
print(f"Anzahl der Früchte: {fruit_counts}")
Führen Sie das Skript aus der Kommandozeile aus:
python3 regular_dict_demo.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
KeyError: Der Schlüssel 'apfel' existiert nicht im Wörterbuch
Anzahl der Früchte: {'banane': 1}
Wie Sie sehen können, führt das Versuchen, die Anzahl eines nicht existierenden Schlüssels zu erhöhen, zu einem Fehler. Die übliche Lösungsmethode besteht darin, zu überprüfen, ob der Schlüssel existiert, bevor man ihn zugreift, was zu einem längeren Code führt.
Hier kommt defaultdict ins Spiel - es behandelt fehlende Schlüssel automatisch, indem es sie beim Zugriff mit einem Standardwert erstellt.
Einführung von defaultdict mit Standardwert 0
Jetzt, da wir das Problem mit regulären Wörterbüchern verstehen, lernen wir, wie wir defaultdict verwenden, um es zu lösen.
Was ist defaultdict?
Das defaultdict ist eine Unterklasse der eingebauten dict-Klasse in Python, die eine Funktion (der sogenannte "Standardfabrikant") als erstes Argument akzeptiert. Wenn ein Schlüssel zugegriffen wird, der nicht existiert, erstellt defaultdict diesen Schlüssel automatisch mit einem Wert, der von der Standardfabrikationsfunktion zurückgegeben wird.
Erstellen eines defaultdict mit Standardwert 0
Lassen Sie uns ein defaultdict erstellen, das für alle fehlenden Schlüssel einen Standardwert von 0 liefert:
Erstellen Sie in Ihrem Editor eine neue Datei namens default_dict_zero.py:
## Zunächst importieren Sie die defaultdict-Klasse aus dem collections-Modul
from collections import defaultdict
## Methode 1: Verwenden von int als Standardfabrikant
## Die int()-Funktion, die ohne Argumente aufgerufen wird, gibt 0 zurück
counter = defaultdict(int)
print("Anfangszustand von counter:", dict(counter))
## Greifen Sie auf einen Schlüssel zu, der noch nicht existiert
print("Wert für 'apfel' (vorher):", counter['apfel'])
## Inkrementieren Sie den Zähler
counter['apfel'] += 1
counter['apfel'] += 1
counter['banane'] += 1
print("Wert für 'apfel' (nachher):", counter['apfel'])
print("Wörterbuch nach den Operationen:", dict(counter))
## Methode 2: Verwenden einer lambda-Funktion (alternativer Ansatz)
counter2 = defaultdict(lambda: 0)
print("\nVerwendung einer lambda-Funktion:")
print("Wert für 'kirsche' (vorher):", counter2['kirsche'])
counter2['kirsche'] += 5
print("Wert für 'kirsche' (nachher):", counter2['kirsche'])
print("Wörterbuch nach den Operationen:", dict(counter2))
Führen Sie das Skript aus der Kommandozeile aus:
python3 default_dict_zero.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Anfangszustand von counter: {}
Wert für 'apfel' (vorher): 0
Wert für 'apfel' (nachher): 2
Wörterbuch nach den Operationen: {'apfel': 2, 'banane': 1}
Verwendung einer lambda-Funktion:
Wert für 'kirsche' (vorher): 0
Wert für 'kirsche' (nachher): 5
Wörterbuch nach den Operationen: {'kirsche': 5}
Wie es funktioniert
Wenn wir defaultdict(int) erstellen, sagen wir Python, die int()-Funktion als Standardfabrikant zu verwenden. Wenn ohne Argumente aufgerufen wird, gibt int() 0 zurück, was der Standardwert für alle fehlenden Schlüssel wird.
Ähnlich können wir eine lambda-Funktion lambda: 0 verwenden, die einfach 0 zurückgibt, wenn sie aufgerufen wird.
Bemerken Sie, wie wir direkt auf Werte für Schlüssel zugreifen und inkrementieren können, die zuvor nicht existierten, ohne Fehler zu erhalten.
Praktischer Anwendungsfall: Zählen von Worthäufigkeiten
Einer der häufigsten Anwendungen von defaultdict mit einem Standardwert von 0 ist das Zählen von Häufigkeiten. Implementieren wir einen Worthäufigkeitszähler, um diesen praktischen Anwendungsfall zu demonstrieren.
Erstellen Sie in Ihrem Editor eine neue Datei namens word_counter.py:
from collections import defaultdict
def count_word_frequencies(text):
## Erstellen Sie ein defaultdict mit Standardwert 0
word_counts = defaultdict(int)
## Teilen Sie den Text in Wörter auf und konvertieren Sie sie in Kleinbuchstaben
words = text.lower().split()
## Bereinigen Sie jedes Wort (entfernen Sie Satzzeichen) und zählen Sie die Vorkommen
for word in words:
## Entfernen Sie übliche Satzzeichen
clean_word = word.strip('.,!?:;()"\'')
if clean_word: ## Überspringen Sie leere Zeichenketten
word_counts[clean_word] += 1
return word_counts
## Testen Sie die Funktion mit einem Beispieltext
sample_text = """
Python ist erstaunlich! Python ist leicht zu lernen, und Python ist sehr leistungsfähig.
Mit Python können Sie Webanwendungen erstellen, Daten analysieren, Spiele bauen
und Aufgaben automatisieren. Die Syntax von Python ist klar und lesbar.
"""
word_frequencies = count_word_frequencies(sample_text)
## Drucken Sie die Ergebnisse
print("Worthäufigkeiten:")
for word, count in sorted(word_frequencies.items()):
print(f" {word}: {count}")
## Finden Sie die häufigsten Wörter
print("\nHäufigste Wörter:")
sorted_words = sorted(word_frequencies.items(), key=lambda x: x[1], reverse=True)
for word, count in sorted_words[:5]: ## Die fünf häufigsten Wörter
print(f" {word}: {count}")
Führen Sie das Skript aus der Kommandozeile aus:
python3 word_counter.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Lesbarer: Macht die Zählereihenfolge klarer und präziser
Das defaultdict mit einem Standardwert von 0 ist besonders nützlich für jede Aufgabe, die das Zählen oder Akkumulieren von Werten umfasst, wie:
Häufigkeitsanalyse
Histogramme
Aggregation von Daten nach Kategorien
Verfolgen von Vorkommen in Protokollen oder Datensätzen
Vergleich der Leistung: defaultdict vs. reguläres dict
Vergleichen wir die Leistung eines defaultdict mit einem Standardwert von 0 mit einem regulären Wörterbuch für eine häufige Zählaufgabe. Dies wird Ihnen helfen, zu verstehen, wann man das eine oder das andere wählt.
Erstellen Sie in Ihrem Editor eine neue Datei namens performance_comparison.py:
import time
from collections import defaultdict
def count_with_regular_dict(data):
"""Zählen Sie die Häufigkeiten mit einem regulären Wörterbuch."""
counts = {}
for item in data:
if item in counts:
counts[item] += 1
else:
counts[item] = 1
return counts
def count_with_defaultdict(data):
"""Zählen Sie die Häufigkeiten mit einem defaultdict mit Standardwert 0."""
counts = defaultdict(int)
for item in data:
counts[item] += 1
return counts
## Generieren Sie Testdaten - eine Liste von Zufallszahlen zwischen 0 und 99
import random
random.seed(42) ## Für reproduzierbare Ergebnisse
data = [random.randint(0, 99) for _ in range(1000000)]
## Misst die Zeit für den regulären Wörterbuch-Ansatz
start_time = time.time()
result1 = count_with_regular_dict(data)
regular_dict_time = time.time() - start_time
## Misst die Zeit für den defaultdict-Ansatz
start_time = time.time()
result2 = count_with_defaultdict(data)
defaultdict_time = time.time() - start_time
## Drucken Sie die Ergebnisse
print(f"Zeit für reguläres Wörterbuch: {regular_dict_time:.4f} Sekunden")
print(f"Zeit für defaultdict: {defaultdict_time:.4f} Sekunden")
print(f"defaultdict ist {regular_dict_time/defaultdict_time:.2f} mal schneller")
## Verifizieren Sie, dass beide Methoden die gleichen Ergebnisse liefern
assert dict(result2) == result1, "Die Zählresultate stimmen nicht überein!"
print("\nBeide Methoden haben die gleichen Zählungen ✓")
## Drucken Sie eine Beispielauswahl der Zählungen
print("\nBeispiel-Zählungen (erste 5 Elemente):")
for i, (key, value) in enumerate(sorted(result1.items())):
if i >= 5:
break
print(f" Nummer {key}: {value} Vorkommen")
Führen Sie das Skript aus der Kommandozeile aus:
python3 performance_comparison.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Zeit für reguläres Wörterbuch: 0.1075 Sekunden
Zeit für defaultdict: 0.0963 Sekunden
defaultdict ist 1.12 mal schneller
Beide Methoden haben die gleichen Zählungen ✓
Beispiel-Zählungen (erste 5 Elemente):
Nummer 0: 10192 Vorkommen
Nummer 1: 9949 Vorkommen
Nummer 2: 9929 Vorkommen
Nummer 3: 9881 Vorkommen
Nummer 4: 9922 Vorkommen
Hinweis: Ihre genauen Zeitangaben können je nach System variieren.
Analyse der Ergebnisse
Der Leistungsvergleich zeigt, dass defaultdict für Zählaufgaben im Allgemeinen schneller als reguläre Wörterbücher ist, weil:
Es entfällt die Notwendigkeit von Schlüsselexistenzprüfungen (if key in dictionary)
Es reduziert die Anzahl der Wörterbuchsuche pro Element
Es vereinfacht den Code, was zu Optimierungen durch den Python-Interpreter führen kann
Neben den Leistungsvorteilen bietet defaultdict diese Vorteile:
Codevereinfachung: Der Code ist kürzer und lesbarer
Reduzierter kognitiver Aufwand: Sie müssen sich nicht daran erinnern, den Fall fehlender Schlüssel zu behandeln
Weniger Fehlerquellen: Weniger Code bedeutet weniger Fehlerquellen
Dies macht defaultdict mit einem Standardwert von 0 zu einer ausgezeichneten Wahl für Zähloperationen, Häufigkeitsanalyse und andere Akkumulationstasks in Python.
Zusammenfassung
In diesem Lab haben Sie gelernt, was das Python-defaultdict ist und wie man es mit einem Standardwert von 0 verwendet. Zusammenfassend betrachten wir, was wir behandelt haben:
Wir haben die Einschränkung von regulären Wörterbüchern identifiziert, die einen KeyError auslöst, wenn auf nicht existierende Schlüssel zugegriffen wird.
Wir haben gelernt, wie man ein defaultdict mit einem Standardwert von 0 mit defaultdict(int) und defaultdict(lambda: 0) erstellt.
Wir haben einen praktischen Anwendungsfall untersucht, indem wir einen Worthäufigkeitszähler implementiert haben.
Wir haben die Leistung von defaultdict und regulären Wörterbüchern verglichen und festgestellt, dass defaultdict nicht nur bequemer, sondern auch schneller für Zählaufgaben ist.
Das defaultdict mit einem Standardwert von 0 ist ein leistungsstarkes Werkzeug, das das Zählen, Akkumulieren und die Häufigkeitsanalyse in Python vereinfacht. Indem es automatisch fehlende Schlüssel behandelt, macht es Ihren Code sauberer, effizienter und fehleranfälliger.
Dieses Muster wird häufig verwendet in:
Datenverarbeitung und -analyse
Spracherkennung und -verarbeitung
Protokollanalyse
Spielentwicklung (für Punktesysteme)
In jeder Situation, die Zähler oder Akkumulatoren umfasst
Indem Sie das defaultdict mit einem Standardwert von 0 beherrschen, haben Sie ein wichtiges Werkzeug für Ihr Python-Programmierwerkzeugkasten hinzugefügt, das Ihnen helfen wird, eleganteren und effizienteren Code zu schreiben.
We use cookies for a number of reasons, such as keeping the website reliable and secure, to improve your experience on our website and to see how you interact with it. By accepting, you agree to our use of such cookies. Privacy Policy