Am facut o functie care va căuta vârstele într-un Dicționar
și arăta de potrivire de nume:
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
Știu cum de a compara și de a găsi vârsta nu't știu cum să arate numele persoanei. În plus, eu sunt obtinerea o KeyError
pentru linia 5. Știu că's nu este corect dar nu pot't dau seama cum de a face o căutare pe dos.
mydict = {'george':16,'amber':19}
print mydict.keys()[mydict.values().index(16)] # Prints george
Sau în Python 3.x:
mydict = {'george':16,'amber':19}
print(list(mydict.keys())[list(mydict.values()).index(16)]) # Prints george
Practic, se separă dicționar's valori într-o listă, găsește poziția de valoarea pe care o au, și devine cheia de la acea poziție.
Mai multe despre keys () "și".valorile()
în Python 3: https://stackoverflow.com/questions/16228248/python-simplest-way-to-get-list-of-values-from-dict
Nu este nici unul. dict
nu este destinat a fi folosit în acest fel.
for name, age in dictionary.items(): # for name, age in dictionary.iteritems(): (for Python 2.x)
if age == search_age:
print(name)
Dacă doriți atât numele and vârsta, ar trebui să fie folosind.elemente()care iti da key
(cheie, valoare)` tupluri:
for name, age in mydict.items():
if age == search_age:
print name
Puteți despacheta tuplu în două variabile separate în "pentru", bucla, apoi se potrivesc cu vârsta.
De asemenea, trebuie să ia în considerare inversarea dicționar daca're, în general, va fi în căutarea de vârstă, și nu există doi oameni au aceeași vârstă:
{16: 'george', 19: 'amber'}
astfel încât să puteți căuta numele pentru o vârstă de a face doar
mydict[search_age]
Am'am sunat-o mydict
în loc de "listă" pentru că "lista" este numele unui tip built-in, și nu ar trebui't folosi numele pentru nimic altceva.
Puteți obține chiar și o listă cu toate persoanele cu o anumită vârstă într-o singură linie:
[name for name, age in mydict.items() if age == search_age]
sau dacă există o singură persoană cu fiecare vârstă:
next((name for name, age in mydict.items() if age == search_age), None)
care va da "Nici una" dacă nu e't oricine cu vârsta.
În cele din urmă, dacă dict
este lung și te're pe Python 2, tu ar trebui să ia în considerare utilizarea .iteritems () "în loc de".elemente()
ca Pisica, Plus, Plus a făcut în răspunsul său, de't nevoie pentru a face o copie a listei.
M-am gândit că ar fi interesant să subliniem care sunt metodele cel mai rapid, și în ce scenariu:
Aici's niste teste am fugit (2012, MacBook Pro)
>>> def method1(list,search_age):
... for name,age in list.iteritems():
... if age == search_age:
... return name
...
>>> def method2(list,search_age):
... return [name for name,age in list.iteritems() if age == search_age]
...
>>> def method3(list,search_age):
... return list.keys()[list.values().index(search_age)]
Rezultatele de la profil.run()` pe fiecare metodă de 100000 de ori:
Metoda 1:
>>> profile.run("for i in range(0,100000): method1(list,16)")
200004 function calls in 1.173 seconds
Metoda 2:
>>> profile.run("for i in range(0,100000): method2(list,16)")
200004 function calls in 1.222 seconds
Metoda 3:
>>> profile.run("for i in range(0,100000): method3(list,16)")
400004 function calls in 2.125 seconds
Deci, acest lucru arată că pentru un mic dict, metoda 1 este cel mai rapid. Acest lucru este cel mai probabil pentru că, se întoarce primul meci, spre deosebire de toate meciurile ca metoda 2 (a se vedea nota de mai jos).
Interesant, efectuarea aceleași teste pe un dict am cu 2700 de intrări, am primit rezultate diferite (de data aceasta condusă de 10000 de ori):
Metoda 1:
>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
20004 function calls in 2.928 seconds
Metoda 2:
>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
20004 function calls in 3.872 seconds
Metoda 3:
>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
40004 function calls in 1.176 seconds
Deci, aici, metoda 3 este mult mai repede. Merge doar pentru a arăta dimensiunea dict va afecta metoda pe care o alegeți.
Note: Metoda 2 se returnează o listă de toate ** nume, întrucât metodele 1 și 3 se întoarcă doar primul meci. Nu am considerat utilizarea de memorie. Am'm nu sunt sigur dacă metoda 3 creează 2 listele suplimentare (keys() și valorile()) și le stochează în memorie.
o linie versiune: (i este un vechi dicționar, p este un inversat dicționar)
explicație : eu.tastele() și eu.valorile() returnează două liste cu chei și valori ale dicționarului respectiv. Zip funcția are capacitatea de a lega împreună liste pentru a produce un dicționar.
avertisment : Acest lucru va funcționa numai dacă valorile sunt hashable și unic.
p = dict(zip(i.values(),i.keys()))
Puteți obține cheia cu ajutorul dict.tastele()
, dict.valorile()
și lista.index()
metode, a se vedea mostre de cod de mai jos:
names_dict = {'george':16,'amber':19}
search_age = int(raw_input("Provide age"))
key = names_dict.keys()[names_dict.values().index(search_age)]
Am găsit asta răspunde foarte eficiente, dar nu foarte ușor de citit pentru mine.
Pentru a face mai clar, puteți inversa cheie și valoarea de un dicționar. Acest lucru este de a face cheile de valori și valori de chei, cum se vede aici.
mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george
sau
mydict = {'george':16,'amber':19}
dict((v,k) for k,v in mydict.iteritems())[16]
care este, în esență, la fel ca răspunde.
Aici e părerea mea despre această problemă. :) Am început să învăț Python, eu numesc asta:
"ușor de Înțeles pentru începători" soluție.
#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!
Dacă doriți să găsiți cheia de valoare, puteți folosi un dicționar de înțelegere pentru a crea o căutare de dicționar și de a folosi apoi pentru a găsi cheia de valoare.
lookup = {value: key for key, value in self.data}
lookup[value]
Luați în considerare utilizarea Panda. După cum se menționează în William McKinney's "Python pentru Analiza Datelor'
un Alt mod de a gândi despre o Serie este ca o lungime fixă, ordonat dict, ca este o mapare de valorile indicelui de valori de date. Acesta poate fi folosit în mai multe contexte în care s-ar putea folosi un dict.
import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)
Pentru a interoga seria ta de a face următoarele:
lookup_list[lookup_list.values == 19]
Care produce:
Out[1]:
amber 19
dtype: int64
Dacă aveți nevoie pentru a face orice altceva cu ieșire transformarea răspunsul într-o listă ar putea fi utile:
answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)
Aici, recover_key nevoie de dicționar și valoarea de a găsi în dicționar. Apoi am buclă peste cheile în dicționar și de a face o comparație cu aceea de valoare și să se întoarcă special key.
def recover_key(dicty,value):
for a_key in dicty.keys():
if (dicty[a_key] == value):
return a_key
aici este meu avea pe ea. Acest lucru este bun pentru afișarea mai multe rezultate doar în cazul în care aveți nevoie de unul. Așa că am adăugat pe listă
myList = {'george':16,'amber':19, 'rachel':19,
'david':15 } #Setting the dictionary
result=[] #Making ready of the result list
search_age = int(input('Enter age '))
for keywords in myList.keys():
if myList[keywords] ==search_age:
result.append(keywords) #This part, we are making list of results
for res in result: #We are now printing the results
print(res)
Și că's...
Nu există nici o modalitate ușoară de a găsi o cheie într-o listă de 'caut' valoarea. Cu toate acestea, dacă știi valoarea, iterarea prin taste, puteți căuta valori în dicționar de element. Dacă D[element], unde D este un dicționar obiect, este egal cu tasta're încercarea de a privi în sus, puteți executa un cod.
D = {'Ali': 20, 'Marina': 12, 'George':16}
age = int(input('enter age:\t'))
for element in D.keys():
if D[element] == age:
print(element)
l's-a răspuns, dar s-ar putea face cu o fantezie 'map/reduce' utilizarea, de exemplu:
def find_key(value, dictionary):
return reduce(lambda x, y: x if x is not None else y,
map(lambda x: x[0] if x[1] == value else None,
dictionary.iteritems()))