969 Stimmen

Schlüssel nach Wert im Wörterbuch abrufen

Ich habe eine Funktion entwickelt, die die Altersangaben in einer Dictionary und zeigt den passenden Namen an:

dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
    if age == search_age:
        name = dictionary[age]
        print name

Ich weiß, wie man vergleicht und das Alter findet, aber ich weiß nicht, wie man den Namen der Person anzeigt. Außerdem erhalte ich eine KeyError wegen der Zeile 5. Ich weiß, dass das nicht korrekt ist, aber ich finde nicht heraus, wie ich die Suche rückwärts durchführen kann.

0 Stimmen

1 Stimmen

Würden Sie ein Wort anhand seiner Definition in einem Wörterbuch finden? NEIN.

0 Stimmen

Sie können eine verschlossene Tür nicht öffnen. (Es sei denn, man bricht sie auf.)

982voto

Stênio Elson Punkte 8903
mydict = {'george': 16, 'amber': 19}
print mydict.keys()[mydict.values().index(16)]  # Prints george

Oder in Python 3.x:

mydict = {'george': 16, 'amber': 19}
print(list(mydict.keys())[list(mydict.values()).index(16)])  # Prints george

Es trennt die Werte des Wörterbuchs in einer Liste, findet die Position des Wertes, den Sie haben, und erhält den Schlüssel an dieser Position.

Mehr über keys() y .values() in Python 3: Wie kann ich eine Liste von Werten aus einem Diktat erhalten?

46 Stimmen

Sieht toll aus, aber funktioniert es immer? Ich meine, tun list.keys() y list.values() Funktionen Elemente in derselben Reihenfolge erzeugen?

43 Stimmen

Ja, sie sind garantiert konsistent. Außerdem wird garantiert, dass sich die Reihenfolge durch Iterationen nicht ändert, solange das Wörterbuch nicht geändert wird.

19 Stimmen

Dies sieht eine gute Lösung zu sein, aber Index gab nur einen Wert richtig, also wenn Sie ve mehrere gleiche Werte, dann sollte es mehrere Schlüssel richtig zurückgeben?

701voto

Cat Plus Plus Punkte 119072

Es gibt keine. dict ist nicht für diese Art der Verwendung vorgesehen.

dictionary = {'george': 16, 'amber': 19}
search_age = input("Provide age")
for name, age in dictionary.items():  # for name, age in dictionary.iteritems():  (for Python 2.x)
    if age == search_age:
        print(name)

131 Stimmen

Ich stimme dem nicht zu... agf's Antwort unten ist konstruktiver. Ein durchaus sinnvoller Anwendungsfall ist nicht "unbeabsichtigt" (Listenverständnis passt ohnehin zu einem solchen Anwendungsfall). A dict können für mehrere Dinge zu verschiedenen Zeiten stehen; Schlüssel und Werte haben natürlich eine klare Bedeutung, aber " dict Elemente mit einem bestimmten Wert" ist eine absolut vernünftige Forderung. Die Empfehlung, eine Liste von Paaren zu verwenden, würde den Kontext aufheben, dass ein Element ein Definition ' voneinander zu unterscheiden, z.B. in Parameterlisten...

11 Stimmen

Ich bin mit dieser Antwort nicht einverstanden. Die Tatsache, dass es sich um eine Möglichkeit handelt, wie in der Antwort von Stênio Elson dargelegt, bedeutet nicht, dass sie nicht als solche verwendet werden sollte. Überhaupt nicht hilfreich.

0 Stimmen

Würden Sie ein Wort in einem Wörterbuch anhand seiner Definition finden? NOPE. @Tropicalrambler

130voto

Patrick Punkte 2487

Ich dachte, es wäre interessant, aufzuzeigen, welche Methoden am schnellsten sind und in welchem Szenario:

Hier sind einige Tests, die ich durchgeführt habe (auf einem 2012 MacBook Pro)

def method1(dict, search_age):
    for name, age in dict.iteritems():
        if age == search_age:
            return name

def method2(dict, search_age):
    return [name for name,age in dict.iteritems() if age == search_age]

def method3(dict, search_age):
    return dict.keys()[dict.values().index(search_age)]

Ergebnisse aus profile.run() für jede Methode 100.000 Mal:

Methode 1:

>>> profile.run("for i in range(0,100000): method1(dict, 16)")
     200004 function calls in 1.173 seconds

Methode 2:

>>> profile.run("for i in range(0,100000): method2(dict, 16)")
     200004 function calls in 1.222 seconds

Methode 3:

>>> profile.run("for i in range(0,100000): method3(dict, 16)")
     400004 function calls in 2.125 seconds

Dies zeigt, dass für ein kleines Diktat die Methode 1 am schnellsten ist. Dies liegt höchstwahrscheinlich daran, dass sie die erste Übereinstimmung zurückgibt, im Gegensatz zu allen Übereinstimmungen wie Methode 2 (siehe Anmerkung unten).


Interessanterweise erhalte ich bei der Durchführung der gleichen Tests mit einem Diktat mit 2700 Einträgen ganz andere Ergebnisse (diesmal 10.000 Mal ausgeführt):

Methode 1:

>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
     20004 function calls in 2.928 seconds

Methode 2:

>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
     20004 function calls in 3.872 seconds

Methode 3:

>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
     40004 function calls in 1.176 seconds

Methode 3 ist also viel schneller. Das zeigt, dass die Größe Ihres Diktats Einfluss darauf hat, welche Methode Sie wählen.

Notas:

  • Methode 2 liefert eine Liste von alle Namen, während die Methoden 1 und 3 nur die erste Übereinstimmung zurückgeben.
  • Ich habe die Speichernutzung nicht berücksichtigt. Ich bin nicht sicher, ob Methode 3 2 zusätzliche Listen erstellt ( keys() y values() ) und speichert sie im Speicher.

10 Stimmen

Nur ein Update: Es scheint, dass dict.values() und dict.keys() beide Listen zurückgeben, die auf die Objekte aus dem ursprünglichen Diktat verweisen, so dass Methode 3 auch diejenige ist, die am wenigsten Speicher verbraucht (sie erstellt nur zwei dünne Listenobjekte, die den Inhalt der Dicts umhüllen, während die anderen Iterator-Elemente erstellen

1 Stimmen

Ich wollte nur einen Vergleich machen, scrollte nach unten und siehe da, es war da. Danke! Technisch, wie Sie bereits darauf hingewiesen, Methode 2 tut nicht genau das gleiche wie 1 und 3, weil es alle Übereinstimmungen zurückgibt. wäre schön, die Ergebnisse für z.B. return next([..]) zu sehen.

0 Stimmen

Ein weiterer wichtiger Hinweis ist die Python-Version. Ich weiß, dass einige Versionen effizientere Implementierungen von Methoden haben als andere.

88voto

fanny Punkte 1283

Einzeilenversion: (i ist ein altes Wörterbuch, p ist ein umgekehrtes Wörterbuch)

Erklärung : i.keys() y i.values() gibt zwei Listen mit den Schlüsseln bzw. Werten des Wörterbuchs zurück. Die Funktion zip kann Listen miteinander verknüpfen, um ein Wörterbuch zu erstellen.

p = dict(zip(i.values(),i.keys()))

Achtung! Dies funktioniert nur, wenn die Werte hashfähig und eindeutig sind.

2 Stimmen

Ja, das wird funktionieren: stackoverflow.com/questions/835092/

26 Stimmen

... und wenn es keine doppelten Werte gibt.

4 Stimmen

Wunderschön. W.r.t der Kommentar oben, natürlich funktioniert es nur, wenn es keine doppelten Werte, aber dann, die Frage, die diesen Thread gestartet macht die Annahme, dass wir eine Eins-zu-Eins-Funktion haben, so dass angesichts dieser Annahme, dies ist die eleganteste Antwort bei weitem.

48voto

Rafael Valero Punkte 2466

Ich fand dies Antwort sehr effektiv, aber für mich nicht sehr leicht zu lesen.

Zur Verdeutlichung können Sie den Schlüssel und den Wert eines Wörterbuchs invertieren. Das heißt, die Schlüssel werden zu Werten und die Werte zu Schlüsseln, wie man sieht aquí .

mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george

oder für Python 3, (danke @kkgarg)

mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.items())
print(res[16]) # Prints george

Auch

print(res.get(16)) # Prints george

was im Wesentlichen dasselbe ist wie dieses andere Antwort .

7 Stimmen

Dies funktioniert möglicherweise nicht, wenn Sie doppelte Werte haben wie {'george':16,'amber':19,'jack':16}

0 Stimmen

Es wird tatsächlich nur ein Wert zurückgegeben, auch wenn es doppelte Werte gibt.

2 Stimmen

Oder Sie können dies einfach in Python 3 tun: [k for k, v in dictionary.items() if v == 16])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X