Wie man in Python ein defaultdict mit einem Standardwert von 0 erstellt

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

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:

  1. 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}")
  1. 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}
Regular Dictionary Demo

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:

  1. 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))
  1. Führen Sie das Skript aus der Kommandozeile aus:
python3 default_dict_zero.py
Default Dict Zero

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.

  1. 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}")
  1. Führen Sie das Skript aus der Kommandozeile aus:
python3 word_counter.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Worthäufigkeiten:
  amazing: 1
  analyze: 1
  and: 3
  applications: 1
  automate: 1
  build: 1
  can: 1
  clear: 1
  create: 1
  data: 1
  easy: 1
  games: 1
  is: 4
  learn: 1
  powerful: 1
  python: 4
  python's: 1
  readable: 1
  syntax: 1
  tasks: 1
  to: 1
  very: 1
  web: 1
  with: 1
  you: 1

Häufigste Wörter:
  python: 4
  is: 4
  and: 3
  amazing: 1
  easy: 1

Wie dies funktioniert

  1. Wir erstellen ein defaultdict(int), um die Wortzahlen mit einem Standardwert von 0 zu speichern
  2. Wir verarbeiten jedes Wort im Text und bereinigen die Satzzeichen
  3. Wir erhöhen einfach die Anzahl für jedes Wort mit word_counts[word] += 1
  4. Für Wörter, die zum ersten Mal auftauchen, wird automatisch der Standardwert 0 zugewiesen

Dieser Ansatz ist erheblich sauberer und effizienter als die Verwendung eines regulären Wörterbuchs mit Existenzprüfungen.

Vorteile der Verwendung von defaultdict mit Standardwert 0

  • Vereinfachter Code: Es ist nicht erforderlich, zu überprüfen, ob Schlüssel existieren, bevor sie inkrementiert werden
  • Weniger Codezeilen: Entfernt die Vorlagen für die Prüfung der Schlüsselexistenz
  • Verringerte Fehler: Vermeidet potenzielle KeyError-Ausnahmen
  • 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.

  1. 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")
  1. 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:

  1. Es entfällt die Notwendigkeit von Schlüsselexistenzprüfungen (if key in dictionary)
  2. Es reduziert die Anzahl der Wörterbuchsuche pro Element
  3. 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:

  1. 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.
  2. Wir haben gelernt, wie man ein defaultdict mit einem Standardwert von 0 mit defaultdict(int) und defaultdict(lambda: 0) erstellt.
  3. Wir haben einen praktischen Anwendungsfall untersucht, indem wir einen Worthäufigkeitszähler implementiert haben.
  4. 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.