Saya membuat sebuah fungsi yang akan terlihat sampai usia dalam Kamus
dan menunjukkan nama yang cocok:
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
Aku tahu bagaimana untuk membandingkan dan menemukan usia aku hanya don't tahu bagaimana untuk menunjukkan nama orang. Selain itu, saya mendapatkan KeyError
karena dari baris 5. Aku tahu itu's tidak benar, tetapi saya dapat't tahu bagaimana untuk membuatnya pencarian mundur.
mydict = {'george':16,'amber':19}
print mydict.keys()[mydict.values().index(16)] # Prints george
Atau di Python 3.x:
mydict = {'george':16,'amber':19}
print(list(mydict.keys())[list(mydict.values()).index(16)]) # Prints george
Pada dasarnya, itu memisahkan kamus's nilai-nilai dalam daftar, menemukan posisi nilai yang anda miliki, dan mendapatkan kunci di posisi itu.
Lebih lanjut tentang tombol()
dan .nilai-nilai()
di Python 3: https://stackoverflow.com/questions/16228248/python-simplest-way-to-get-list-of-values-from-dict
Ada adalah tidak ada. dict
tidak dimaksudkan untuk digunakan dengan cara ini.
for name, age in dictionary.items(): # for name, age in dictionary.iteritems(): (for Python 2.x)
if age == search_age:
print(name)
Jika anda ingin kedua nama and usia, anda harus menggunakan .item()
yang memberikan kunci(key, value)
tupel:
for name, age in mydict.items():
if age == search_age:
print name
Anda dapat membongkar tupel menjadi dua variabel yang terpisah tepat di untuk
loop, maka sesuai dengan usia.
Anda juga harus mempertimbangkan membalikkan kamus jika anda're umumnya akan mencari sampai dengan usia, dan tidak ada dua orang yang memiliki usia yang sama:
{16: 'george', 19: 'amber'}
jadi anda dapat mencari nama untuk usia dengan hanya melakukan
mydict[search_age]
I've telah menyebutnya mydict
bukan daftar
karena daftar
adalah nama dari tipe built-in, dan anda tidak't menggunakan nama itu untuk hal lain.
Anda bahkan bisa mendapatkan daftar dari semua orang-orang dengan usia tertentu dalam satu baris:
[name for name, age in mydict.items() if age == search_age]
atau jika hanya ada satu orang dengan usia masing-masing:
next((name for name, age in mydict.items() if age == search_age), None)
yang hanya akan memberikan anda Tidak
jika ada isn't orang dengan usia itu.
Akhirnya, jika dict
lebih lama dan anda're pada Python 2, anda harus mempertimbangkan menggunakan .iteritems()
bukan .item()
sebagai Kucing Plus Plus lakukan dalam jawaban-nya, karena itu doesn't perlu membuat salinan dari daftar.
Saya pikir itu akan menarik untuk menunjukkan metode yang tercepat, dan apa skenario:
Berikut ini's beberapa tes aku berlari (pada 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)]
Hasil dari profil.run()
pada masing-masing metode 100000 kali:
Metode 1:
>>> profile.run("for i in range(0,100000): method1(list,16)")
200004 function calls in 1.173 seconds
Metode 2:
>>> profile.run("for i in range(0,100000): method2(list,16)")
200004 function calls in 1.222 seconds
Metode 3:
>>> profile.run("for i in range(0,100000): method3(list,16)")
400004 function calls in 2.125 seconds
Jadi ini menunjukkan bahwa untuk dict, metode 1 adalah yang tercepat. Hal ini kemungkinan besar karena kembali pertandingan pertama, sebagai lawan untuk semua pertandingan seperti metode 2 (lihat catatan di bawah).
Menariknya, melakukan tes yang sama pada dict saya miliki dengan 2700 entri, saya mendapatkan hasil yang cukup berbeda (saat ini menjalankan 10000 kali):
Metode 1:
>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
20004 function calls in 2.928 seconds
Metode 2:
>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
20004 function calls in 3.872 seconds
Metode 3:
>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
40004 function calls in 1.176 seconds
Jadi di sini, metode 3 banyak lebih cepat. Hanya pergi untuk menunjukkan ukuran dict akan mempengaruhi metode yang anda pilih.
Catatan: Metode 2 kembali daftar semua nama-nama, sedangkan metode 1 dan 3 kembali hanya pertandingan pertama. Saya belum mempertimbangkan penggunaan memori. I'm tidak yakin jika metode 3 menciptakan 2 daftar ekstra (keys() dan nilai-nilai()) dan toko mereka dalam memori.
satu baris version: (aku lebih tua kamus, p adalah terbalik kamus)
penjelasan : saya.kunci-kunci() dan saya.nilai-nilai() mengembalikan dua daftar dengan kunci dan nilai-nilai dari kamus masing-masing. Zip fungsi memiliki kemampuan untuk mengikat bersama-sama daftar untuk menghasilkan sebuah kamus.
peringatan : Ini akan bekerja hanya jika nilai-nilai hashable dan unik.
p = dict(zip(i.values(),i.keys()))
Anda bisa mendapatkan kunci dengan menggunakan dict.kunci-kunci()
, dict.nilai-nilai()
dan klik disini.index()
metode, lihat contoh kode di bawah ini:
names_dict = {'george':16,'amber':19}
search_age = int(raw_input("Provide age"))
key = names_dict.keys()[names_dict.values().index(search_age)]
Saya menemukan ini jawaban yang sangat efektif tetapi tidak sangat mudah untuk membaca untuk saya.
Untuk membuatnya lebih jelas anda dapat membalikkan key dan nilai dari sebuah kamus. Hal ini membuat nilai-nilai kunci dan nilai-nilai kunci, seperti yang terlihat di sini.
mydict = {'george':16,'amber':19}
res = dict((v,k) for k,v in mydict.iteritems())
print(res[16]) # Prints george
atau
mydict = {'george':16,'amber':19}
dict((v,k) for k,v in mydict.iteritems())[16]
yang pada dasarnya adalah sama yang ini lain jawaban.
Berikut ini saya mengambil masalah ini. :) Saya baru saja mulai belajar Python, jadi saya sebut ini:
"mudah Dipahami untuk pemula" solusi.
#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!
Jika anda ingin menemukan kunci dengan nilai, anda dapat menggunakan kamus pemahaman untuk membuat lookup kamus dan kemudian menggunakannya untuk menemukan kunci dari nilai.
lookup = {value: key for key, value in self.data}
lookup[value]
Pertimbangkan untuk menggunakan Panda. Seperti yang dinyatakan di William McKinney's "Python untuk Analisis Data'
cara Lain untuk berpikir tentang Seri a adalah sebagai fixed-length, memerintahkan dict, karena merupakan pemetaan dari nilai indeks untuk nilai-nilai data. Hal ini dapat digunakan dalam banyak konteks di mana anda mungkin menggunakan sebuah dict.
import pandas as pd
list = {'george':16,'amber':19}
lookup_list = pd.Series(list)
Untuk query seri anda lakukan hal berikut:
lookup_list[lookup_list.values == 19]
Yang menghasilkan:
Out[1]:
amber 19
dtype: int64
Jika anda perlu untuk melakukan hal lain dengan output transformasi jawaban ke daftar mungkin berguna:
answer = lookup_list[lookup_list.values == 19].index
answer = pd.Index.tolist(answer)
Di sini, recover_key membawa kamus dan nilai untuk menemukan dalam kamus. Kami kemudian lingkaran di atas tombol di kamus dan membuat perbandingan dengan nilai dan mengembalikan kunci tertentu.
def recover_key(dicty,value):
for a_key in dicty.keys():
if (dicty[a_key] == value):
return a_key
di sini saya mengambil itu. Ini adalah baik untuk menampilkan beberapa hasil hanya dalam kasus anda perlu satu. Jadi saya menambahkan daftar juga
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)
Dan yang's ini...
Tidak ada cara yang mudah untuk menemukan sebuah kunci di daftar oleh 'mencari' nilai. Namun, jika anda tahu nilai, iterasi melalui tombol, anda dapat melihat nilai-nilai dalam kamus dengan elemen. Jika D[elemen] dimana D adalah kamus objek, adalah sama dengan kunci anda're mencoba untuk melihat ke atas, anda dapat mengeksekusi beberapa kode.
D = {'Ali': 20, 'Marina': 12, 'George':16}
age = int(input('enter age:\t'))
for element in D.keys():
if D[element] == age:
print(element)
it's menjawab, tapi hal itu bisa dilakukan dengan mewah 'peta/mengurangi' gunakan, misalnya:
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()))