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.)

12voto

Andriy Ivaneyko Punkte 18213

Sie können den Schlüssel mit Hilfe von dict.keys() , dict.values() y list.index() Methoden, siehe Codebeispiele unten:

names_dict = {'george':16,'amber':19}
search_age = int(raw_input("Provide age"))
key = names_dict.keys()[names_dict.values().index(search_age)]

2 Stimmen

Sie verwenden keine definierten search_age var in der nächsten Zeile... Vielleicht sollten Sie ersetzen value con search_age ?

3 Stimmen

Ich erhalte folgende Fehlermeldung: Das Objekt "dict_values" hat kein Attribut "index".

0 Stimmen

@Blue_Elephant könnten Sie bitte liefern Code-Schnipsel Sie haben Fehler und Python-Version (auch Druck von type(dict_values) nützlich wäre) ?

11voto

Brett Punkte 471
get_key = lambda v, d: next(k for k in d if d[k] is v)

0 Stimmen

Netter Einzeiler. Wie auch immer, is sollte nur für Gleichheitstests von Singletons verwendet werden ( None , True , False usw.). Die Tatsache, dass CPython String-Literale wiederverwendet (und damit a = 'foobar'; a is 'foobar' es True ) ist ein Implementierungsdetail, auf das man sich nicht verlassen sollte.

1 Stimmen

Und noch eine Bemerkung: get_key wirft StopIteration wenn der Wert nicht im Wörterbuch vorhanden ist - es wäre besser, wenn man next(..., None) die Folgendes zurückgeben würde None wenn der Wert nicht gefunden wurde.

0 Stimmen

Eine geringfügige Änderung wird funktionieren, wenn das Wörterbuch nicht einzelne Elemente, sondern Mengen enthält: get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)

11voto

Deithrian Punkte 153

Hier ist meine Meinung zu diesem Problem:) Ich habe gerade angefangen, Python zu lernen, so nenne ich dies:

Die Lösung "Verständlich für Anfänger".

#Code without comments.

list1 = {'george':16,'amber':19, 'Garry':19}
search_age = raw_input("Provide age: ")
print
search_age = int(search_age)

listByAge = {}

for name, age in list1.items():
    if age == search_age:
        age = str(age)
        results = name + " " +age
        print results

        age2 = int(age)
        listByAge[name] = listByAge.get(name,0)+age2

print
print listByAge

.

#Code with comments.
#I've added another name with the same age to the list.
list1 = {'george':16,'amber':19, 'Garry':19}
#Original code.
search_age = raw_input("Provide age: ")
print
#Because raw_input gives a string, we need to convert it to int,
#so we can search the dictionary list with it.
search_age = int(search_age)

#Here we define another empty dictionary, to store the results in a more 
#permanent way.
listByAge = {}

#We use double variable iteration, so we get both the name and age 
#on each run of the loop.
for name, age in list1.items():
    #Here we check if the User Defined age = the age parameter 
    #for this run of the loop.
    if age == search_age:
        #Here we convert Age back to string, because we will concatenate it 
        #with the person's name. 
        age = str(age)
        #Here we concatenate.
        results = name + " " +age
        #If you want just the names and ages displayed you can delete
        #the code after "print results". If you want them stored, don't...
        print results

        #Here we create a second variable that uses the value of
        #the age for the current person in the list.
        #For example if "Anna" is "10", age2 = 10,
        #integer value which we can use in addition.
        age2 = int(age)
        #Here we use the method that checks or creates values in dictionaries.
        #We create a new entry for each name that matches the User Defined Age
        #with default value of 0, and then we add the value from age2.
        listByAge[name] = listByAge.get(name,0)+age2

#Here we print the new dictionary with the users with User Defined Age.
print
print listByAge

.

#Results
Running: *\test.py (Thu Jun 06 05:10:02 2013)

Provide age: 19

amber 19
Garry 19

{'amber': 19, 'Garry': 19}

Execution Successful!

10voto

rmd0001 Punkte 103

Einzeilige Lösung mit Listenverständnis, die mehrere Schlüssel zurückgibt, wenn der Wert möglicherweise mehrfach vorhanden ist.

[key for key,value in mydict.items() if value == 16]

9voto

Axel Punkte 150

Erwägen Sie die Verwendung von Pandas. Wie in William McKinney's "Python for Data Analysis" beschrieben

Eine andere Möglichkeit, sich eine Serie vorzustellen, ist eine geordnete Serie mit fester Länge. Diktat, da es eine Zuordnung von Indexwerten zu Datenwerten ist. Sie kann sein in vielen Kontexten verwendet werden, in denen man ein Diktat verwenden könnte.

import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)

Gehen Sie wie folgt vor, um Ihre Serie abzufragen:

lookup_list[lookup_list.values == 19]

Daraus ergibt sich:

Out[1]: 
amber    19
dtype: int64

Wenn Sie etwas anderes mit der Ausgabe machen wollen, transformieren Sie die Antwort in eine Liste umzuwandeln, könnte nützlich sein:

answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)

0 Stimmen

Er ist der Schöpfer der Pandas. Im Volksmund ist er allerdings eher als Wes bekannt.

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