HOWTO · Python
Schlüssel nach Wert im Python-Dictionary suchen
Dieses Tutorial demonstriert, wie man in einem Python-Dictionary den Schlüssel nach dem Wert sucht.
Auf dieser Seite
Python-Dictionaries ordnen Schlüssel Werten zu. Um einen Schlüssel anhand eines Werts zu finden, müssen Sie die Einträge des Dictionaries durchsuchen. Iterieren Sie über die Schlüssel-Wert-Paare und vergleichen Sie jeden Wert mit dem Zielwert. Verwenden Sie eine Schleife oder next(), wenn Sie den ersten passenden Schlüssel benötigen, und eine List Comprehension, wenn Sie alle passenden Schlüssel benötigen. Die Suche durchläuft die Einträge, bis sie einen Treffer findet oder das Dictionary vollständig durchsucht hat.
Schlüssel-Wert-Paare mit einer Schleife durchsuchen
dict.items() stellt ein iterierbares Objekt mit Schlüssel-Wert-Paaren bereit. Eine Schleife darüber kann den ersten Schlüssel zurückgeben, dessen Wert dem Zielwert entspricht. Wenn Sie nach der Schleife None zurückgeben, erhalten Aufrufer ein eindeutiges Ergebnis, falls kein Treffer vorliegt. Kann None selbst ein gültiger Schlüssel sein, verwenden Sie stattdessen einen eindeutigen Sentinel oder geben Sie ein Paar wie (found, key) zurück.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
def find_key_by_value(dictionary, target):
for key, value in dictionary.items():
if value == target:
return key
return None
scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_key_by_value(scores, 87))
Lin
Bei einem Treffer gibt die Schleife den Schlüssel sofort zurück. Es ist also der erste passende Schlüssel in der Iterationsreihenfolge des Dictionaries. Haben mehrere Schlüssel den Zielwert, werden die späteren Treffer nach dem ersten nicht mehr geprüft.
Den ersten passenden Schlüssel mit next() ermitteln
Ein Generatorausdruck formuliert dieselbe Suche nach dem ersten Treffer kompakt. Übergeben Sie ihn mit einem Standardwert an next(). Dann gibt der Aufruf None zurück, falls der Generator keinen passenden Schlüssel liefert, statt StopIteration auszulösen.
Definieren Sie den Zielwert als Parameter der Funktion, in der der Ausdruck ausgeführt wird. So ist target sowohl bei einem Treffer als auch dann definiert, wenn kein Wert passt:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
def find_key_with_next(dictionary, target):
return next((key for key, value in dictionary.items() if value == target), None)
scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_key_with_next(scores, 87))
print(find_key_with_next(scores, 100))
Der Generator liefert Schlüssel bei Bedarf und erstellt keine Liste aller Treffer. Wenn kein Wert passt, wird der Standardwert zurückgegeben. Wählen Sie einen Standardwert, der nicht mit einem gültigen Schlüssel verwechselt werden kann, falls Ihre Daten None als Schlüssel enthalten können.
Alle passenden Schlüssel mit einer List Comprehension sammeln
Wenn doppelte Werte relevant sind, sammeln Sie alle passenden Schlüssel mit einer List Comprehension:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
def find_all_keys(dictionary, target):
return [key for key, value in dictionary.items() if value == target]
scores = {"Ada": 91, "Lin": 87, "Sam": 91}
print(find_all_keys(scores, 91))
['Ada', 'Sam']
Die zurückgegebene Liste ist leer, wenn kein Wert passt, und enthält andernfalls alle passenden Schlüssel. Auch ein filter()-Ausdruck kann passende Schlüssel-Wert-Paare auswählen. Die List Comprehension zeigt jedoch die Bedingung und die gesammelten Schlüssel an einer Stelle.
Einen Schlüssel über aufeinander abgestimmte Schlüssel- und Wertelisten finden
Eine weitere Möglichkeit besteht darin, dict.keys() und dict.values() in Listen umzuwandeln. Die Positionen stimmen überein: Der Schlüssel an Position i gehört zum Wert an derselben Position. Der Aufruf von index() auf der Werteliste findet die erste Position mit dem Zielwert. Verwenden Sie diese Position, um den zugehörigen Schlüssel aus der Schlüsselliste auszuwählen.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
scores = {"Ada": 91, "Lin": 87, "Sam": 91}
keys = list(scores.keys())
values = list(scores.values())
position = values.index(91)
print(keys[position])
Ada
index() löst ValueError aus, wenn der Wert fehlt. Prüfen Sie daher zuerst, ob der Wert in values enthalten ist, oder behandeln Sie den Fehler, wenn ein fehlender Wert zu erwarten ist. Bei doppelten Werten wählt index() nur die erste passende Position aus.
Duplikate, fehlende Werte und Laufzeit berücksichtigen
Wählen Sie das Ergebnis passend zur Aufgabe: Eine Schleife oder next() gibt einen Schlüssel zurück, während die List Comprehension eine Liste aller passenden Schlüssel liefert. Die Methoden für den ersten Treffer und index() enden beim ersten Treffer; das Ergebnis hängt von der Iterationsreihenfolge des Dictionaries ab. Wenn kein Treffer vorliegt, kann das Ergebnis None oder eine leere Liste sein. Bei der Methode mit den aufeinander abgestimmten Listen wird ValueError ausgelöst, sofern Sie nicht vorher die Zugehörigkeit prüfen oder den Fehler behandeln.
Im ungünstigsten Fall müssen alle diese Ansätze jeden Eintrag prüfen. Die Suchzeit wächst dann proportional zur Anzahl der Dictionary-Einträge. Die Schleife und der Generatorausdruck erstellen keine Sammlung der Treffer. Die List Comprehension erstellt eine Ergebnisliste; bei der Methode mit den aufeinander abgestimmten Listen werden vor der Suche separate Schlüssel- und Wertelisten angelegt. Wenn Sie wiederholt Werte in Schlüssel umwandeln müssen, können Sie eine umgekehrte Zuordnung verwalten. Berücksichtigen Sie dabei doppelte Werte: Ein einfaches umgekehrtes Dictionary speichert nur einen Schlüssel pro Wert. Legen Sie bei verschachtelten Dictionaries zuerst fest, welche Ebene durchsucht werden soll, und wenden Sie dasselbe Muster zum Durchlaufen der Einträge auf dieses Dictionary an.