Saya membuat fungsi yang akan mencari usia dalam Dictionary
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
Saya tahu bagaimana membandingkan dan menemukan usia saya hanya tidak tahu bagaimana menunjukkan nama orang tersebut. Selain itu, saya mendapatkan KeyError
karena baris 5. Saya tahu itu tidak benar tetapi saya tidak tahu cara membuatnya mundur.
python
dictionary
user998316
sumber
sumber
Jawaban:
Tidak ada.
dict
tidak dimaksudkan untuk digunakan dengan cara ini.sumber
Python 3.x
list.items()
bukannyalist.iteritems()
harus digunakandict
dapat untuk banyak hal pada waktu yang berbeda; kunci dan nilai memiliki makna yang jelas, tentu saja, tetapi "dict
item dengan nilai yang diberikan" adalah permintaan yang sangat masuk akal. Rekomendasi untuk menggunakan daftar pasangan akan membuang konteks bahwa satu item adalah ' definisi ' dari yang lain, misalnya dalam daftar parameter ...Atau dengan Python 3.x:
Pada dasarnya, ini memisahkan nilai kamus dalam daftar, menemukan posisi nilai yang Anda miliki, dan mendapatkan kunci pada posisi itu.
Lebih lanjut tentang
keys()
dan.values()
dalam Python 3: Bagaimana saya bisa mendapatkan daftar nilai dari dict?sumber
list.keys()
danlist.values()
fungsi menghasilkan item dalam urutan yang sama?index
metode ini.Jika Anda ingin nama dan usia, Anda harus menggunakan
.items()
yang memberi Anda(key, value)
tupel kunci :Anda dapat membongkar tuple menjadi dua variabel terpisah tepat di
for
loop, lalu mencocokkan usia.Anda juga harus mempertimbangkan membalik kamus jika Anda secara umum akan mencari berdasarkan usia, dan tidak ada dua orang yang memiliki usia yang sama:
sehingga Anda dapat mencari nama untuk usia hanya dengan melakukan
Saya telah memanggilnya
mydict
alih-alihlist
karena itulist
adalah nama tipe bawaan, dan Anda tidak boleh menggunakan nama itu untuk hal lain.Anda bahkan bisa mendapatkan daftar semua orang dengan usia tertentu dalam satu baris:
atau jika hanya ada satu orang dengan setiap usia:
yang hanya akan memberi Anda
None
jika tidak ada orang dengan usia itu.Terakhir, jika
dict
panjang dan Anda menggunakan Python 2, Anda harus mempertimbangkan untuk menggunakan.iteritems()
daripada yang dilakukan.items()
Cat Plus Plus dalam jawabannya, karena itu tidak perlu membuat salinan daftar.sumber
dict
dengan daftar pasangan.dict
masuk akal.value --> key
ataukey --> value
Saya pikir akan menarik untuk menunjukkan metode mana yang paling cepat, dan dalam skenario apa:
Inilah beberapa tes yang saya jalankan (pada MacBook Pro 2012)
Hasil dari
profile.run()
pada setiap metode 100000 kali:Metode 1:
Metode 2:
Metode 3:
Jadi ini menunjukkan bahwa untuk dikte kecil, metode 1 adalah yang tercepat. Ini kemungkinan besar karena mengembalikan kecocokan pertama, sebagai lawan dari semua kecocokan seperti metode 2 (lihat catatan di bawah).
Menariknya, melakukan tes yang sama pada dict yang saya miliki dengan 2.700 entri, saya mendapatkan hasil yang sangat berbeda (kali ini berjalan 10.000 kali):
Metode 1:
Metode 2:
Metode 3:
Jadi di sini, metode 3 jauh lebih cepat. Hanya pergi untuk menunjukkan ukuran dict Anda akan mempengaruhi metode mana yang Anda pilih.
Catatan: Metode 2 mengembalikan daftar semua nama, sedangkan metode 1 dan 3 hanya mengembalikan kecocokan pertama. Saya belum mempertimbangkan penggunaan memori. Saya tidak yakin apakah metode 3 membuat 2 daftar tambahan (kunci () dan nilai ()) dan menyimpannya dalam memori.
sumber
.keys()
`.values()
kembali tampilan kamus, yang ringan.satu versi baris: (i adalah kamus lama, p adalah kamus terbalik)
Penjelasan:
i.keys()
dani.values()
mengembalikan dua daftar dengan kunci dan nilai kamus masing-masing. Fungsi zip memiliki kemampuan untuk menyatukan daftar untuk menghasilkan kamus.Peringatan: Ini hanya akan berfungsi jika nilainya hashable dan unik.
sumber
atau lebih baik
sumber
sumber
lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
Coba satu-baris ini untuk membalikkan kamus:
sumber
Saya menemukan jawaban ini sangat efektif tetapi tidak mudah dibaca untuk saya.
Untuk membuatnya lebih jelas, Anda dapat membalikkan kunci dan nilai kamus. Ini membuat nilai kunci dan nilai kunci, seperti yang terlihat di sini .
atau
yang pada dasarnya sama dengan jawaban yang lain ini .
sumber
Jika Anda ingin menemukan kunci berdasarkan nilainya, Anda dapat menggunakan pemahaman kamus untuk membuat kamus pencarian dan kemudian menggunakannya untuk menemukan kunci dari nilainya.
sumber
Anda bisa mendapatkan kunci dengan menggunakan
dict.keys()
,dict.values()
danlist.index()
metode, lihat contoh kode di bawah ini:sumber
search_age
var yang ditentukan pada baris berikutnya ... Mungkin Anda harus menggantivalue
dengansearch_age
?type(dict_values)
akan berguna)?Inilah pendapat saya tentang masalah ini. :) Saya baru saja mulai belajar Python, jadi saya sebut ini:
Solusi "Pemahaman untuk pemula".
.
.
sumber
sumber
is
harus digunakan hanya untuk pengujian persamaan lajang (None
,True
,False
dll). Fakta bahwa CPython menggunakan kembali string literal (dan karena itua = 'foobar'; a is 'foobar'
adalahTrue
) merupakan implementasi detail dan tidak boleh diandalkan.get_key
akan melemparStopIteration
jika nilainya tidak ada di kamus - akan lebih baik untuk menggunakannext(..., None)
yang akan kembaliNone
jika nilainya tidak ditemukan.get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
Pertimbangkan menggunakan Panda. Sebagaimana dinyatakan dalam "Python untuk Analisis Data" William McKinney
Untuk menanyakan seri Anda, lakukan hal berikut:
Yang menghasilkan:
Jika Anda perlu melakukan hal lain dengan output yang mengubah jawaban menjadi daftar mungkin berguna:
sumber
Di sini, recover_key mengambil kamus dan nilai untuk ditemukan dalam kamus. Kami kemudian mengulangi kunci dalam kamus dan membuat perbandingan dengan nilai dan mengembalikan kunci tertentu.
sumber
kita bisa mendapatkan
Key
daridict
oleh:sumber
sumber
itu dijawab, tetapi bisa dilakukan dengan penggunaan 'peta / pengurangan' yang mewah, misalnya:
sumber
Cat Plus Plus menyebutkan bahwa ini bukan cara kamus dimaksudkan untuk digunakan. Inilah alasannya:
Definisi kamus adalah analog dengan pemetaan dalam matematika. Dalam hal ini, dict adalah pemetaan K (himpunan kunci) ke V (nilai-nilai) - tetapi tidak sebaliknya. Jika Anda mendereferensi dikt, Anda berharap mendapatkan satu nilai yang dikembalikan. Namun, sangat sah untuk kunci yang berbeda untuk memetakan ke nilai yang sama, misalnya:
Ketika Anda mencari kunci dengan nilai yang sesuai, Anda pada dasarnya membalik kamus. Tapi pemetaan belum tentu bisa dibalik! Dalam contoh ini, meminta kunci yang sesuai dengan v1 dapat menghasilkan k1 atau k3. Haruskah Anda mengembalikan keduanya? Hanya yang pertama ditemukan? Itu sebabnya indexof () tidak ditentukan untuk kamus.
Jika Anda tahu data Anda, Anda bisa melakukan ini. Tetapi API tidak dapat berasumsi bahwa kamus yang arbitrer tidak dapat dibalik, karenanya tidak ada operasi semacam itu.
sumber
ini adalah pendapat saya. Ini bagus untuk menampilkan beberapa hasil jika Anda membutuhkannya. Jadi saya menambahkan daftar juga
Dan itu saja ...
sumber
Outputnya adalah sebagai berikut:
sumber
Tidak ada cara mudah untuk menemukan kunci dalam daftar dengan 'mencari' nilainya. Namun, jika Anda tahu nilainya, iterasi melalui tombol, Anda bisa mencari nilai dalam kamus dengan elemen. Jika D [elemen] di mana D adalah objek kamus, sama dengan kunci yang ingin Anda cari, Anda dapat menjalankan beberapa kode.
sumber
Anda perlu menggunakan kamus dan membalikkan kamus itu. Ini berarti Anda memerlukan struktur data lain. Jika Anda menggunakan python 3, gunakan
enum
modul tetapi jika Anda menggunakan python 2.7 gunakanenum34
yang kembali porting untuk python 2.Contoh:
sumber
sumber
Hanya jawaban saya di
lambda
danfilter
.sumber
sudah dijawab, tetapi karena beberapa orang menyebutkan membalik kamus, inilah cara Anda melakukannya dalam satu baris (dengan asumsi pemetaan 1: 1) dan beberapa data berbeda:
python 2.6:
2.7+:
jika menurut Anda ini bukan 1: 1, Anda masih dapat membuat pemetaan terbalik yang masuk akal dengan beberapa baris:
seberapa lambat ini: lebih lambat dari pencarian sederhana, tetapi tidak sepelan yang Anda kira - pada kamus entri 'lurus' 100000, pencarian 'cepat' (yaitu mencari nilai yang seharusnya berada di awal tombol) sekitar 10x lebih cepat daripada membalik seluruh kamus, dan pencarian 'lambat' (menjelang akhir) sekitar 4-5x lebih cepat. Jadi setelah paling banyak sekitar 10 pencarian, itu dibayar untuk dirinya sendiri.
versi kedua (dengan daftar per item) memakan waktu sekitar 2,5x selama versi sederhana.
Juga ada beberapa hasil menarik dengan ifilter. Secara teoritis, ifilter harus lebih cepat, karena kita dapat menggunakan itervalues () dan mungkin tidak harus membuat / menelusuri seluruh daftar nilai. Dalam prakteknya, hasilnya ... aneh ...
Jadi, untuk offset kecil, secara dramatis lebih cepat daripada versi sebelumnya (2,36 * u * S vs minimum 1,48 * m * S untuk kasus sebelumnya). Namun, untuk offset besar di dekat akhir daftar, itu secara dramatis lebih lambat (15,1 ms vs 1,48 ms yang sama). Penghematan kecil di ujung bawah tidak sebanding dengan biaya di ujung atas, imho.
sumber
[
di dalamnya, jika itu. jika tidak, pastikan ada dua baris, atau letakkan di;
antara keduanya jika tidak.Terkadang int () mungkin diperlukan:
sumber
Berikut adalah solusi yang berfungsi baik di Python 2 dan Python 3:
Bagian sampai
[search_age]
membangun kamus terbalik (di mana nilainya adalah kunci dan sebaliknya). Anda dapat membuat metode pembantu yang akan men-cache kamus terbalik ini seperti:atau bahkan lebih umum pabrik yang akan membuat metode pencarian nama berdasarkan usia untuk satu atau lebih dari daftar Anda
sehingga Anda dapat melakukan:
Perhatikan bahwa saya berganti nama
list
menjadiages_by_name
karena yang pertama adalah tipe yang sudah ditentukan sebelumnya.sumber
Ini adalah cara Anda mengakses kamus untuk melakukan apa yang Anda inginkan:
tentu saja, nama Anda sangat tidak seperti itu akan mencetak usia, tetapi TIDAK mencetak nama. Karena Anda mengakses dengan nama, itu menjadi lebih dimengerti jika Anda menulis:
Lebih baik:
sumber
Untuk beberapa kejadian, gunakan:
sumber
*** NameError: global name 'dictionary' is not defined
filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )