Kodokon kodokon.com

Fortgeschrittene Strukturen: Tupel, Sets und collections

Wähle die Struktur, die zu jedem Bedarf passt: unveränderliche Tupel, Sets für Zugehörigkeitstests in O(1), Counter und defaultdict für wiederkehrende Muster.

9 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Die richtige Datenstruktur zu wählen regelt Lesbarkeit und Performance in einem Zug. Das Tupel ist eine unveränderliche Sequenz: ideal für einen heterogenen Datensatz fester Größe (Koordinaten, ein Schlüssel-Wert-Paar). Unveränderlich bedeutet hashbar (sofern es sein Inhalt ist): Ein Tupel kann daher als Dictionary-Schlüssel oder Set-Element dienen, was eine Liste nicht kann. Unpacking macht Code ausdrucksstark - und eine Funktion, die "mehrere Werte zurückgibt", gibt in Wirklichkeit ein Tupel zurück.

PYTHON
point = (48.85, 2.35)
lat, lon = point

def min_max(values):
    return min(values), max(values)

low, high = min_max([3, 1, 4, 1, 5])
print(low, high)

distances = {("paris", "lyon"): 465}
print(distances[("paris", "lyon")])
Unpacking, mehrfache Rückgabe und ein Tupel als Dictionary-Schlüssel

Das Set garantiert Eindeutigkeit und bietet einen Zugehörigkeitstest in im Schnitt O(1), wo eine Liste O(n) braucht. In einer Schleife, die tausendfach x in collection prüft, zeigt sich der Unterschied sofort. Set-Operatoren (& Schnittmenge, - Differenz, | Vereinigung) sind ein echter Fortschritt gegenüber verschachtelten Schleifen: Zwei Listen von Bezeichnern zu vergleichen - wer verschwunden ist, wer neu ist - passt in zwei Zeilen.

PYTHON
active = {"ada", "linus", "guido"}
banned = {"linus", "mallory"}

print(active & banned)
print(active - banned)
print(active | banned)

emails = ["a@x.io", "b@x.io", "a@x.io"]
unique = set(emails)
print(len(unique))
Set-Operationen und Deduplizierung

Das Modul collections deckt zwei alltägliche Bedürfnisse ab. Counter zählt die Vorkommen in einem Iterable und stellt most_common(n) bereit - Schluss mit von Hand geschriebenen Zähl-Dictionaries. defaultdict(factory) baut den fehlenden Wert im Flug: defaultdict(list) ist das kanonische Werkzeug, um Elemente nach Schlüssel zu gruppieren, ohne bei jedem Schleifendurchlauf die Existenz des Schlüssels zu prüfen.

PYTHON
from collections import Counter, defaultdict

words = ["go", "py", "go", "rs", "go"]
counts = Counter(words)
print(counts.most_common(2))

groups = defaultdict(list)
pairs = [("fr", "Ada"), ("us", "Lin"), ("fr", "Zoe")]
for country, name in pairs:
    groups[country].append(name)
print(dict(groups))
Counter zum Zählen, defaultdict zum Gruppieren

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Warum kann ein Tupel im Gegensatz zu einer Liste als Dictionary-Schlüssel dienen?
    • Es ist schneller zu erzeugen
    • Es ist unveränderlich, daher hashbar
    • Es kann nur Zahlen enthalten
    • Dictionaries wandeln Listen in Tupel um
  2. Du testest tausendfach x in collection über 100.000 Elemente. Welche Struktur solltest du wählen?
    • Eine Liste, sequenziell durchsucht
    • Ein Set, Zugehörigkeit in im Schnitt O(1)
    • Ein Tupel, kompakter als eine Liste
  3. Was bewirkt bei groups = defaultdict(list) das Lesen eines fehlenden Schlüssels?
    • Es löst einen KeyError aus
    • Es gibt eine leere Liste zurück und fügt den Schlüssel ein
    • Es gibt None zurück, ohne das Dictionary zu verändern