Saya ingin melakukan sesuatu seperti:
foo = {'foo':1,'zip':2,'zam':3,'bar':4}
if ("foo","bar") in foo:
#do stuff
Bagaimana cara saya mengecek apakah 'foo' dan 'bar' keduanya dalam dict foo?
python
dictionary
Jean-François Corbett
sumber
sumber
set
ini lebih baik. Seperti biasa ... mengukurnya! -)Jika Anda masih menggunakan Python 2, Anda bisa melakukannya
Jika Anda masih menggunakan Python yang sangat lama <= 2.6, Anda dapat memanggil
set
dict, tetapi itu akan beralih ke seluruh dict untuk membangun set, dan itu lambat:sumber
set(("foo","bar")) <= myDict.keys()
yang menghindari set sementara, jadi jauh lebih cepat. Untuk pengujian saya, kecepatannya hampir sama dengan menggunakan semua ketika kueri adalah 10 item. Semakin lambat karena kueri semakin besar.if {'foo', 'bar'} <= set(myDict): ...
Rig pembandingan sederhana untuk 3 alternatif.
Masukkan nilai Anda sendiri untuk D dan Q
sumber
d.viewkeys()
dibuatset(q) <= d.viewkeys()
.Python 2.7.5
punyad.keys()
metode juga.set(q) <= ...
TypeError: can only compare to a set
. Maaf! :))d.viewkeys() >= set(q)
. Saya datang ke sini mencoba mencari tahu mengapa pesanan itu penting!Anda tidak harus membungkus sisi kiri dalam satu set. Anda bisa melakukan ini:
Ini juga berkinerja lebih baik daripada
all(k in d...)
solusinya.sumber
Menggunakan set :
Kalau tidak:
sumber
set(d)
adalah sama denganset(d.keys())
(tanpa daftar perantara yangd.keys()
membangun)Bagaimana dengan ini:
sumber
all
.Saya pikir ini adalah yang paling cerdas dan pithonic.
sumber
Sementara saya suka jawaban Alex Martelli, sepertinya tidak Pythonic bagi saya. Artinya, saya pikir bagian penting dari menjadi Pythonic adalah agar mudah dimengerti. Dengan tujuan itu,
<=
tidak mudah dipahami.Meskipun lebih banyak karakter, menggunakan
issubset()
seperti yang disarankan oleh jawaban Karl Voigtland lebih dimengerti. Karena metode itu dapat menggunakan kamus sebagai argumen, solusi pendek dan mudah dipahami adalah:Saya ingin menggunakannya
{'foo', 'bar'}
sebagai penggantiset(('foo', 'bar'))
, karena lebih pendek. Namun, itu tidak bisa dimengerti dan saya pikir kawat gigi terlalu mudah dikacaukan sebagai kamus.sumber
.issubset()
. Saya pikir berada dalam dokumentasi Python membuatnya menjadi Pythonic secara default.Solusi Alex Martelli
set(queries) <= set(my_dict)
adalah kode terpendek tetapi mungkin bukan yang tercepat. Asumsikan Q = len (kueri) dan D = len (my_dict).Ini membutuhkan O (Q) + O (D) untuk membuat dua set, dan kemudian (satu harapan!) Hanya O (min (Q, D)) untuk melakukan tes subset - dengan asumsi tentu saja Python mengatur pencarian. adalah O (1) - ini adalah kasus terburuk (ketika jawabannya adalah Benar).
Solusi generator hughdbrown (et al?)
all(k in my_dict for k in queries)
Adalah yang terburuk O (Q).Faktor-faktor yang rumit:
(1) loop pada gadget berbasis set semua dilakukan pada kecepatan-C sedangkan gadget berbasis apa pun adalah perulangan dengan bytecode.
(2) Penelepon gadget berbasis apa pun mungkin dapat menggunakan pengetahuan tentang kemungkinan kegagalan untuk memesan item permintaan yang sesuai sedangkan gadget berbasis set tidak memungkinkan kontrol seperti itu.
Seperti biasa, jika kecepatan itu penting, pembandingan dengan kondisi operasional adalah ide yang bagus.
sumber
Anda dapat menggunakan .issubset () juga
sumber
Bagaimana kalau menggunakan lambda?
sumber
Jika Anda ingin:
kemudian:
sumber
Bukan untuk menyarankan bahwa ini bukan sesuatu yang belum Anda pikirkan, tetapi saya menemukan bahwa hal yang paling sederhana biasanya yang terbaik:
sumber
Jason, () tidak perlu dalam Python.
sumber
Hanya saya ambil ini, ada dua metode yang mudah dimengerti dari semua opsi yang diberikan. Jadi kriteria utama saya adalah memiliki kode yang sangat mudah dibaca, bukan kode yang sangat cepat. Agar kode dapat dimengerti, saya lebih suka memberi kemungkinan:
Fakta bahwa "var <= var2.keys ()" mengeksekusi lebih cepat dalam pengujian saya di bawah ini, saya lebih suka yang ini.
sumber
Dalam hal menentukan apakah hanya beberapa kunci yang cocok, ini berfungsi:
Namun pilihan lain untuk menemukan jika hanya beberapa kunci yang cocok:
sumber
Opsi lain untuk mendeteksi apakah semua kunci ada dict:
sumber
Ini sepertinya berhasil
sumber
()
akan dievaluasi terlebih dahulu dan menghasilkanTrue
, yang kemudian akan memeriksa apakahTrue in ok
. Bagaimana cara kerjanya?