Adakah cara mudah untuk menemukan kunci dengan mengetahui nilainya di dalam kamus?
Yang bisa saya pikirkan hanyalah ini:
key = [key for key, value in dict_obj.items() if value == 'value'][0]
python
dictionary
RadiantHex
sumber
sumber
iteritems
seperti bagi saya ini membuat perbedaan 40x lebih cepat ... menggunakan metode (). Selanjutnyareverse_dictionary = {v:k for k,v in dictionary.items()}
Jawaban:
Tidak ada. Jangan lupa bahwa nilainya dapat ditemukan di sejumlah kunci, termasuk 0 atau lebih dari 1.
sumber
</sigh>
Pemahaman daftar Anda melewati semua item dict menemukan semua kecocokan, lalu mengembalikan kunci pertama. Ekspresi generator ini hanya akan mengulang sejauh yang diperlukan untuk mengembalikan nilai pertama:
dimana
dd
dikt. Akan meningkatStopIteration
jika tidak ada kecocokan yang ditemukan, jadi Anda mungkin ingin menangkapnya dan mengembalikan pengecualian yang lebih sesuai sepertiValueError
atauKeyError
.sumber
keys = { key for key,value in dd.items() if value=='value' }
untuk mendapatkan himpunan semua kunci jika beberapa cocok.Ada beberapa kasus di mana kamus adalah pemetaan satu: satu
Misalnya,
Pendekatan Anda tidak masalah jika Anda hanya melakukan satu pencarian. Namun jika Anda perlu melakukan lebih dari satu pencarian, akan lebih efisien untuk membuat kamus terbalik
Jika ada kemungkinan beberapa kunci dengan nilai yang sama, Anda perlu menentukan perilaku yang diinginkan dalam kasus ini.
Jika Python Anda 2.6 atau lebih tua, Anda bisa menggunakan
sumber
ivd=dict([(v,k) for (k,v) in d.items()])
invd = { v:k for k,v in d.items() }
Versi ini 26% lebih pendek dari versi Anda tetapi fungsinya sama, bahkan untuk nilai yang berlebihan / ambigu (mengembalikan kecocokan pertama, seperti milik Anda). Namun, ini mungkin dua kali lebih lambat dari Anda, karena ini membuat daftar dari dict dua kali.
Atau jika Anda lebih suka singkat daripada keterbacaan, Anda dapat menyimpan satu karakter lagi dengan
Dan jika Anda lebih suka efisiensi, pendekatan @ PaulMcGuire lebih baik. Jika ada banyak kunci yang memiliki nilai yang sama, lebih efisien untuk tidak membuat contoh daftar kunci tersebut dengan pemahaman daftar dan sebagai gantinya gunakan generator:
sumber
dict.keys()
dandict.values()
dijamin sesuai selamadict
tidak dimutasi antar panggilan.Karena ini masih sangat relevan, Google hit pertama dan saya hanya meluangkan waktu untuk mencari tahu, saya akan memposting solusi saya (bekerja dengan Python 3):
Ini akan memberi Anda nilai pertama yang cocok.
sumber
Mungkin kelas seperti kamus seperti
DoubleDict
di bawah ini yang Anda inginkan? Anda dapat menggunakan salah satu dari metaclass yang disediakan sehubungan denganDoubleDict
atau mungkin menghindari penggunaan metaclass sama sekali.sumber
Tidak, Anda tidak dapat melakukan ini secara efisien tanpa melihat semua kunci dan memeriksa semua nilainya. Jadi, Anda perlu
O(n)
waktu untuk melakukan ini. Jika Anda perlu melakukan banyak pencarian seperti itu, Anda perlu melakukan ini secara efisien dengan membuat kamus terbalik (dapat juga dilakukan diO(n)
) dan kemudian melakukan pencarian di dalam kamus terbalik ini (setiap pencarian akan mengambil rata-rataO(1)
).Berikut adalah contoh bagaimana membuat kamus terbalik (yang akan dapat melakukan pemetaan satu ke banyak) dari kamus normal:
Misalnya jika Anda
Anda
h_reversed
akan menjadisumber
Sejauh yang saya tahu, tidak ada satu pun, namun satu cara untuk melakukannya adalah dengan membuat dikt untuk pencarian normal berdasarkan kunci dan dikt lain untuk pencarian terbalik berdasarkan nilai.
Ada contoh penerapan seperti itu di sini:
http://code.activestate.com/recipes/415903-two-dict-classes-which-can-lookup-keys-by-value-an/
Ini berarti bahwa mencari kunci untuk suatu nilai dapat menghasilkan banyak hasil yang dapat dikembalikan sebagai daftar sederhana.
sumber
Saya tahu ini mungkin dianggap 'boros', tetapi dalam skenario ini saya sering menyimpan kunci sebagai kolom tambahan dalam catatan nilai:
itu tradeoff dan terasa salah, tetapi sederhana dan berhasil dan tentu saja tergantung pada nilai-nilai menjadi tuple daripada nilai-nilai sederhana.
sumber
Buat kamus terbalik
Jika Anda memiliki banyak pencarian terbalik yang harus dilakukan
sumber
Melalui nilai dalam kamus dapat berupa objek apa pun yang tidak dapat di-hash atau diindeks dengan cara lain. Jadi, menemukan kunci berdasarkan nilainya tidaklah wajar untuk jenis koleksi ini. Setiap query seperti itu dapat dijalankan hanya dalam waktu O (n). Jadi jika ini adalah tugas yang sering Anda harus melihat beberapa pengindeksan kunci seperti Jon sujjested atau bahkan beberapa indeks spasial (DB atau http://pypi.python.org/pypi/Rtree/ ).
sumber
Saya menggunakan kamus sebagai semacam "database", jadi saya perlu menemukan kunci yang dapat saya gunakan kembali. Untuk kasus saya, jika nilai kunci adalah
None
, maka saya dapat mengambilnya dan menggunakannya kembali tanpa harus "mengalokasikan" id lain. Hanya berpikir saya akan membagikannya.Saya suka yang ini karena saya tidak perlu mencoba dan menangkap kesalahan seperti
StopIteration
atauIndexError
. Jika ada kunci yang tersedia, makafree_id
akan berisi satu. Jika tidak ada, maka itu akan terjadiNone
. Mungkin bukan pythonic, tapi saya benar-benar tidak ingin menggunakan a ditry
sini ...sumber