Inverse Wörterbuchsuche in Python
Gibt es eine einfache Möglichkeit zu finden, einen Schlüssel durch die Kenntnis der Wert in einem Wörterbuch?
Ich denken kann, ist dies:
key = [key for key, value in dict_obj.items() if value == 'value'][0]
Kommentar zu dem Problem - Öffnen
mögliche Duplikate von: stackoverflow.com/questions/483666/...
werfen Sie einen Blick auf meine Antwort wie konstruieren eine umgekehrte Wörterbuch
Google führte mich hier... Und ich muss sagen.. warum ist niemand mit
iteritems
für mich macht eine 40x schnellere Unterschied... mit der ().nächste Methode InformationsquelleAutor der Frage RadiantHex | 2010-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine. Vergessen Sie nicht, dass der Wert, der gefunden werden kann auf eine beliebige Anzahl von Tasten, einschließlich 0 oder mehr als 1.
InformationsquelleAutor der Antwort Ignacio Vazquez-Abrams
Ihre Liste Verständnis geht durch alle dict - Elemente finden Sie alle Spiele, dann nur gibt den ersten Schlüssel. Dieser generator-Ausdruck wird nur Durchlaufen, so weit wie nötig zu geben den ersten Wert:
wo
dd
ist der dict. ErhöhenStopIteration
wenn keine übereinstimmung gefunden wird, so möchten Sie vielleicht zu fangen, und bringen Sie eine weitere entsprechende Ausnahme wieValueError
oderKeyError
.InformationsquelleAutor der Antwort PaulMcG
Gibt es Fälle, in denen ein Wörterbuch ist ein eins:eins-Zuordnung
Eg,
Dein Ansatz ist ok, wenn Sie Sie tun nur einer einzigen Suche. Allerdings, wenn Sie mehr tun müssen, als eine lookup-es wird effizienter erstellen Sie eine inverse Wörterbuch
Wenn es eine Möglichkeit, mehrere keys mit dem gleichen Wert, Sie müssen angeben, dass das gewünschte Verhalten in diesem Fall.
Wenn Ihr Python 2.6 oder älter sind, können Sie verwenden
InformationsquelleAutor der Antwort John La Rooy
Diese version ist 26% kürzer als deins funktioniert aber identisch auch für redundante/mehrdeutige Werte (gibt das erste match, wie Sie es tut). Es ist jedoch wahrscheinlich doppelt so langsam wie deine, denn es entsteht eine Liste, aus der dict-doppelt.
Oder wenn Sie es bevorzugen Kürze über Lesbarkeit können Sie speichern ein oder mehrere Zeichen mit
Und wenn Sie es vorziehen Effizienz, @PaulMcGuire ist Ansatz ist besser. Wenn es gibt viele Tasten, die den gleichen Wert, ist es effizienter, nicht zu instanziieren, die Liste der Schlüssel, die mit einer Liste Verständnis und stattdessen einen generator:
InformationsquelleAutor der Antwort hobs
Vielleicht ein dictionary-ähnliche Klasse wie
DoubleDict
unten ist, was Sie wollen? Sie können verwenden Sie eine der zur Verfügung gestellten Metaklassen in Verbindung mitDoubleDict
oder kann vermeiden, mit einer Metaklasse, an die alle.InformationsquelleAutor der Antwort Noctis Skytower
Da dies immer noch sehr relevant, der erste Google-Treffer, und ich habe gerade einige Zeit damit verbringen, herauszufinden this out, ich poste meine (arbeiten in Python 3) Lösung:
Wird es geben Sie den ersten Wert, der passt.
InformationsquelleAutor der Antwort Freek
Gibt es nicht soweit ich weiß, eine Art und Weise jedoch, es zu tun zu schaffen, ist ein dict für den normalen lookup nach Schlüssel und weiteren dict-für reverse-lookup-Wert.
Es ist ein Beispiel für eine solche Implementierung hier:
http://code.activestate.com/recipes/415903-two-dict-classes-which-can-lookup-keys-by-value-an/
Bedeutet dies, dass man sich die Schlüssel für einen Wert könnte das Ergebnis in mehrere Ergebnisse, die zurückgegeben werden können, als eine einfache Liste.
InformationsquelleAutor der Antwort Jon
Nein, können Sie nicht tun, diese effizient, ohne sich in all die Tasten und prüfen alle Ihre Werte. So müssen Sie
O(n)
Zeit, dies zu tun. Wenn Sie müssen eine Menge tun, um solche Suchvorgänge, die Sie brauchen, um diese effizient durch den Bau einer reversed-Wörterbuch (kann man auch inO(n)
) und dann eine Suche innerhalb dieser umgekehrte Wörterbuch (jede Suche durchschnittlichO(1)
).Hier ist ein Beispiel, wie konstruieren eine umgekehrte Wörterbuch (wird in der Lage sein, das zu machen, zu viele mapping) von einem normalen Wörterbuch:
Zum Beispiel, wenn Ihr
Ihre
h_reversed
werdenInformationsquelleAutor der Antwort Salvador Dali
Durch die Werte im Wörterbuch werden kann Objekt jeder Art, Sie kann nicht zerlegt werden oder indiziert anderen Weg. So finden Sie Schlüssel, die durch den Wert ist unnatürlich für diese Sammlung geben. Jede Abfrage kann durchgeführt werden in O(n) Zeit nur. Also, wenn dies häufige Aufgabe, die Sie sollten einen Blick für einige Indizierung der Schlüssel wie Jon sujjested oder vielleicht sogar einem räumlichen index (DB oder http://pypi.python.org/pypi/Rtree/ ).
InformationsquelleAutor der Antwort Odomontois
Ich weiß, das könnte als 'verschwenderisch', aber in diesem Szenario, das ich Häufig speichern Sie den Schlüssel als zusätzliche Spalte in der Wert-Rekord:
es ist ein Kompromiss und fühlt sich falsch an, aber es ist einfach und funktioniert und ist natürlich abhängig von Werte-Tupeln eher als einfache Werte.
InformationsquelleAutor der Antwort CarlS
Ich bin mit Wörterbüchern als eine Art "Datenbank", also brauche ich einen Schlüssel zu finden, die ich wiederverwenden kann. Für meinen Fall, wenn ein Schlüssel ist der Wert
None
, dann kann ich es nehmen und verwenden es, ohne zu "reservieren" eine andere id. Gerade dachte ich würde teilen.Diese mag ich, weil ich nicht haben, um zu versuchen und fangen Sie alle Fehler wie
StopIteration
oderIndexError
. Wenn es ein key verfügbar ist, dannfree_id
enthalten. Wenn nicht, dann wird es einfachNone
. Wahrscheinlich nicht pythonic, aber ich wusste wirklich nicht wollen, zu einemtry
hier...InformationsquelleAutor der Antwort Zizouz212
Als Wert sein könnte, existiert nicht im dict, eine mehr pythonic und auto-dokumentierter code wäre:
In der Tat dicts sind nicht zur Beantwortung solcher Problematik, wenn Sie Begegnung diesem problem auf einem neu gestalteten Programm, dann sollten Sie vielleicht überprüfen Sie Ihre design.
InformationsquelleAutor der Antwort Emmanuel
Dies ist wörtlich
InformationsquelleAutor der Antwort Anon