HOWTO · Python

Lookup-Tabelle in Python

Dieses Tutorial zeigt, wie man Lookup-Tabellen in Python verwendet, und hebt Methoden wie Dictionaries, Listen, NumPy-Arrays und Pandas DataFrames hervor. Lernen Sie, effiziente Datenabruftechniken zu implementieren, um Ihre Programmierfähigkeiten zu optimieren und die Anwendungsleistung zu verbessern. Entdecken Sie praktische Codebeispiele und detaillierte Erklärungen, um Lookup-Tabellen in Python zu meistern.

Auf dieser Seite

Eine Lookup-Tabelle speichert Werte, die der Code anhand eines Schlüssels oder einer Position abrufen kann. Sie ist nützlich, wenn dieselbe Zuordnung wiederholt abgefragt wird, etwa wenn Produktcodes Preisen zugeordnet werden. Durch das Vorberechnen eines Ergebnisses lässt sich eine wiederholte Berechnung vermeiden. Die Tabelle benötigt jedoch Speicher und muss aktualisiert werden, wenn sich ihre Quelldaten ändern.

Wähle die Datenstruktur anhand der Form der Schlüssel und der benötigten Operationen aus: Dictionaries akzeptieren beliebige hashbare Schlüssel, Listen und Arrays verwenden ganzzahlige Positionen, und ein DataFrame unterstützt benannte Spalten und Tabellenoperationen. Die folgenden Beispiele zeigen, wie sich mit jeder Struktur ein praktischer Lookup umsetzen lässt.

Wähle eine Lookup-Tabellenstruktur für deine Daten

Überlege zuerst, wodurch ein Wert bestimmt wird. Verwende ein Dictionary für Namen, Codes oder andere Schlüssel, die keine lückenlosen ganzzahligen Positionen sind. Eine Liste eignet sich, wenn die Positionen aufeinanderfolgende Ganzzahlen ab null sind und sich die Werte in einer Python-Sequenz speichern lassen. Verwende ein NumPy-Array, wenn die Daten numerisch sind und Array-Operationen benötigt werden. Ein Pandas DataFrame passt, wenn jeder Datensatz mehrere benannte Felder enthält oder du filtern und andere Tabellenoperationen ausführen musst. NumPy und Pandas sind Bibliotheken von Drittanbietern; installiere sie in deiner Projektumgebung, bevor du die entsprechenden Beispiele verwendest.

Verwende ein Dictionary für schlüsselbasierte Lookups

Ein Dictionary ordnet jedem eindeutigen, hashbaren Schlüssel einen Wert zu. Es eignet sich gut für nicht fortlaufende Schlüssel und macht mit get einen Ersatzwert ausdrücklich sichtbar. Bei einem fehlenden Schlüssel gibt get den angegebenen Standardwert zurück; der Zugriff mit eckigen Klammern löst dagegen KeyError aus, wenn der Schlüssel fehlt.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

prices = {"tea": 2.5, "coffee": 3.0, "cocoa": 2.75}
print(prices["tea"])
print(prices.get("juice", "not listed"))
2.5
not listed

Der Abruf aus einem Dictionary hat im Durchschnitt eine Komplexität von O(1); das ist keine Garantie für jede denkbare Arbeitslast. Schlüssel müssen hashbar sein. Wird einem vorhandenen Schlüssel ein neuer Wert zugewiesen, ersetzt dieser den bisherigen Wert. Ändern sich die Quelldatensätze, aktualisiere auch das Dictionary, damit der Lookup keine veralteten Daten zurückgibt. Die unveränderte Beispielausgabe zeigt für den fehlenden Schlüssel den englischen Ersatztext „not listed“.

Verwende eine Liste für lückenlose ganzzahlige Indizes

Eine Liste ist eine einfache Tabelle, wenn die gültigen Indizes lückenlos sind und bei null beginnen: Der Index i verweist auf das (i + 1)th Element. Für lückenhafte Kennungen wie Kundennummern eignet sie sich schlecht, denn Lücken würden ungenutzte Plätze oder eine separate Zuordnung erfordern. Der Zugriff per Index hat die Komplexität O(1); die gespeicherten Werte bleiben gewöhnliche Python-Objekte.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

labels = ["bronze", "silver", "gold"]

def label_for(index):
    if 0 <= index < len(labels):
        return labels[index]
    return "index out of range"

print(label_for(2))
print(label_for(5))
gold
index out of range

Die explizite Bereichsprüfung fängt sowohl Indizes kleiner als null als auch solche ab, die mindestens der Listenlänge entsprechen. Python-Listen erlauben außerdem negative Indizes, die vom Ende rückwärts zählen. Prüfe den Index daher zuerst, wenn deine Tabellenschlüssel ausschließlich nichtnegative Positionen sein sollen. Der englische Text „index out of range“ bezeichnet die Ausgabe für einen ungültigen Index.

Verwende ein NumPy-Array für numerische Daten

Ein NumPy-Array ist nützlich, wenn die Tabelle Zahlen enthält und du außerdem vektorisierte Berechnungen, Slicing oder andere Array-Operationen benötigst. Installiere NumPy separat; es gehört nicht zur Python-Standardbibliothek. Ein einzelner Wert wird weiterhin lediglich über seinen Index abgerufen. Ein Array ist daher nicht automatisch ein schnellerer Ersatz für ein Dictionary.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import numpy as np

rates = np.array([1.0, 1.5, 2.0, 2.5])
index = 2
if 0 <= index < len(rates):
    print(rates[index])
else:
    print("index out of range")
print((rates * 2).tolist())
2.0
[2.0, 3.0, 4.0, 5.0]

Die Bereichsprüfung ist hilfreich, wenn ein Index aus einer externen Eingabe stammt. NumPy-Arrays verwenden in der Regel einen einheitlichen Elementtyp, was numerische Operationen erleichtern kann. Wähle Elementtyp und Form passend zu den Daten, die du speichern möchtest.

Verwende einen Pandas DataFrame für tabellarische Daten

Ein DataFrame eignet sich für Datensätze mit benannten Spalten, insbesondere wenn der Lookup Teil einer umfassenderen Filter- oder Analyseaufgabe ist. Installiere Pandas separat. Das Filtern nach einer Spalte vergleicht Zeilen; wenn du nur Zeilen auswählst, ist das Ergebnis ein DataFrame. Im folgenden Ausdruck gibt die Auswahl der einzelnen Spalte price mit .loc eine Series zurück. Der Filter kann die Zeilen durchlaufen. Für wiederholte Lookups nach einem Schlüssel kannst du stattdessen einen passenden Index setzen und .loc verwenden.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

items = pd.DataFrame({
    "code": ["A", "B", "C"],
    "price": [1.25, 2.50, 3.75],
})
match = items.loc[items["code"] == "B", "price"]
if not match.empty:
    print(match.iloc[0])
else:
    print("not found")
2.5

Dieses Muster behandelt den Fall, dass kein passender Code vorhanden ist, ohne auf ein leeres Ergebnis zuzugreifen. Wenn die Codes eindeutig sind und wiederholt abgefragt werden, drückt items.set_index("code").loc["B", "price"] einen Lookup anhand eines Labels aus. Stelle vor dem Zugriff sicher, dass der Code vorhanden ist, und lege fest, wie doppelte Labels behandelt werden sollen. Der unveränderte Beispielcode findet hier den Eintrag für „B“ und gibt 2.5 aus. Bei einem fehlenden Treffer würde er stattdessen den englischen Text „not found“ ausgeben.

Behandle fehlende Schlüssel und ungültige Indizes

Wähle eine Richtlinie für fehlende Werte, die zum aufrufenden Code passt. dict.get(key, default) gibt einen Ersatzwert zurück, während key in mapping dir ermöglicht, das Fehlen eines Schlüssels von einem gespeicherten Wert zu unterscheiden, der zufällig dem Ersatzwert entspricht. Verwende try/except KeyError, wenn fehlende Schlüssel in der umgebenden Logik als Ausnahme behandelt werden sollen. Prüfe bei Listen und Arrays den Index mit 0 <= index < len(table), falls negative Positionen nicht vom Ende zählen sollen. Prüfe bei einem DataFrame-Filter, ob das Ergebnis leer ist, bevor du seine erste Zeile auswählst. Verwende durchgehend dieselbe Richtlinie, damit klar ist, ob ein fehlender Eintrag einen Platzhalter, einen Standardwert oder einen Fehler zur Folge hat.

Vergleiche Leistung und praktische Kompromisse

Ein Dictionary-Lookup nach Schlüssel hat im Durchschnitt die Komplexität O(1), ebenso der Zugriff auf eine Position in einer Liste oder einem eindimensionalen Array. Ein boolescher DataFrame-Filter hat im Allgemeinen die Komplexität O(n), weil er die Zeilen prüft. Ein Index kann den Zugriff anhand von Labels unterstützen; Kosten und Verhalten hängen jedoch von seiner Erstellung und der Datenform ab. Diese Komplexitätsangaben sagen nicht für jede Eingabegröße die tatsächliche Laufzeit voraus: Einrichtungskosten, Schlüsseltypen, Datenlayout, Bibliotheksoperationen und Speicherbedarf spielen ebenfalls eine Rolle.

Verwende die einfachste Struktur, die zu den Schlüsseln und Operationen passt: ein Dictionary für beliebige Schlüssel, eine Liste für lückenlose Positionen, ein NumPy-Array für numerische Array-Operationen und einen DataFrame für beschriftete Tabellendaten. Wenn Leistung entscheidend ist, miss sie mit repräsentativen Daten. Berücksichtige auch den Speicherbedarf: Dictionaries speichern Schlüssel-Wert-Zuordnungen, Listen halten Referenzen auf Python-Objekte und NumPy-Arrays speichern typisierte Elemente. Der tatsächliche Bedarf hängt von den Daten und der Implementierung ab. Wird eine Lookup-Tabelle aus veränderlichen Quelldaten abgeleitet, erstelle sie neu oder aktualisiere sie bei jeder Änderung, damit sie keine veralteten Ergebnisse liefert.