Saya ingin menguji apakah ada kunci dalam kamus sebelum memperbarui nilai untuk kunci tersebut. Saya menulis kode berikut:
if 'key1' in dict.keys():
print "blah"
else:
print "boo"
Saya pikir ini bukan cara terbaik untuk menyelesaikan tugas ini. Apakah ada cara yang lebih baik untuk menguji kunci dalam kamus?
python
dictionary
Mohan Gulati
sumber
sumber
dict.keys()
membuat daftar kunci, menurut dokumentasi docs.python.org/2/library/stdtypes.html#dict.keys tetapi saya akan terkejut jika pola ini tidak dioptimalkan untuk, dalam implementasi yang serius, untuk menerjemahkan untukif 'key1' in dict:
.x in dict.keys()
untuk memeriksa kunci. Dan itu terjadi karena cara yang biasa untuk iterate lebih kunci di Jawafor (Type k : dict.keySet())
, kebiasaan ini menyebabkanfor k in dict.keys()
untuk merasa lebih alami daripadafor k in dict
(yang seharusnya masih baik dalam hal kinerja?), tetapi kemudian memeriksa kunciif k in dict.keys()
juga, yang merupakan masalah ...if k in dict_:
menguji keberadaan k di KEYS dict_, jadi Anda masih tidak perludict_.keys()
. (Ini menggigit saya, karena bunyinya bagi saya seperti pengujian untuk nilai dalam dict. Tapi tidak.)Jawaban:
in
adalah cara yang dimaksudkan untuk menguji keberadaan kunci dalam adict
.Jika Anda menginginkan default, Anda selalu dapat menggunakan
dict.get()
:dan jika Anda ingin selalu memastikan nilai default untuk kunci apa pun Anda dapat menggunakan
dict.setdefault()
berulang kali ataudefaultdict
daricollections
modul, seperti:tetapi secara umum,
in
kata kunci adalah cara terbaik untuk melakukannya.sumber
get
jika saya akan mengeluarkan item dari kamus. Tidak masuk akal dalam menggunakanin
dan menarik item keluar dari kamus.in
adalah cara terbaik untuk melakukannya.0
misalnya. Belajar ini dengan cara yang sulit: /Anda tidak perlu memanggil kunci:
Itu akan jauh lebih cepat karena menggunakan hashing kamus daripada melakukan pencarian linier, yang akan dilakukan tombol panggil.
sumber
if key in d1
butuh beberapa0.17265701293945312
detik. Panggilanif key in d1.keys()
mengambil0.23871088027954102
- ini adalah definisi klasik dari optimasi mikro. Menghemat0.07884883880615234
detik bukan peningkatan kinerja.keys()
memberi Anda keuntungan komputasi 0,01 detik. Untuk ~ 500.000 kunci, tidak meneleponkeys()
memberi Anda keuntungan 0,1 detik. Untuk ~ 5.000.000 kunci, tidak meneleponkeys()
adalah .4 detik lebih cepat, tetapi untuk 50.000.000 kunci MEMANGGILkeys()
ADALAH 3 DETIK LEBIH CEPAT!Anda dapat menguji keberadaan kunci dalam kamus, menggunakan kata kunci dalam :
Penggunaan umum untuk memeriksa keberadaan kunci dalam kamus sebelum memutasikannya adalah untuk menginisialisasi-awal nilai (misalnya jika nilai Anda adalah daftar, misalnya, dan Anda ingin memastikan bahwa ada daftar kosong yang dapat Anda tambahkan saat memasukkan nilai pertama untuk kunci). Dalam kasus seperti itu, Anda mungkin menemukan
collections.defaultdict()
jenis yang menarik.Dalam kode yang lebih lama, Anda mungkin juga menemukan beberapa kegunaan dari
has_key()
, metode yang sudah usang untuk memeriksa keberadaan kunci dalam kamus (gunakan sajakey_name in dict_name
, sebagai gantinya).sumber
key in dict.keys()
. Coba hapus semua kode kecuali untuk pemeriksaan ini dan lihat apa hasilnya.Anda dapat mempersingkat ini:
Namun, ini merupakan perbaikan kosmetik terbaik. Mengapa Anda percaya ini bukan cara terbaik?
sumber
Untuk info tambahan tentang eksekusi cepat dari metode yang diusulkan pada jawaban yang diterima (putaran 10m):
'key' in mydict
waktu yang terlewati 1,07 detikmydict.get('key')
waktu yang terlewati 1,84 detikmydefaultdict['key']
waktu yang terlewati 1,07 detikOleh karena itu menggunakan
in
ataudefaultdict
disarankan untuk tidakget
.sumber
get
1,84 adalah <1,07 * 2 ;-PSaya akan merekomendasikan menggunakan
setdefault
metode ini sebagai gantinya. Sepertinya itu akan melakukan semua yang Anda inginkan.sumber
setdefault
harus dilakukan dengan pertanyaan OP?Kamus dengan python memiliki metode get ('key', default). Jadi Anda bisa mengatur nilai default jika tidak ada kunci.
sumber
Bagaimana dengan menggunakan EAFP (lebih mudah untuk meminta maaf daripada izin):
Lihat posting SO lainnya:
Menggunakan try vs if dalam python atau
Memeriksa keberadaan anggota dalam Python
sumber
Menggunakan operator ternary:
sumber
Cara di mana Anda bisa mendapatkan hasilnya adalah:
Mana yang lebih baik tergantung pada 3 hal:
Baca lebih banyak: http://paltman.com/try-except-performance-in-python-a-simple-test/
Gunakan try / block alih-alih 'in' atau 'if':
sumber
2to3
, dan melihat bahwa sintaks tanpa coba selalu lebih cepat daripada dengan sintaks dengan try, bahkan dalam kasus di mana kunci berada di dikt.Hanya Python 2: (dan
in
sudah mendukung python 2.7 )Anda dapat menggunakan metode has_key ():
sumber
.has_key()
telah ditinggalkan ; Anda harus menggunakanin
seperti yang ditunjukkan pada jawaban lain.Hanya FYI yang menambah Chris. B (jawaban terbaik):
Bekerja juga; alasannya adalah bahwa panggilan
int()
kembali0
adalah apa yangdefaultdict
dilakukan di belakang layar (saat membuat kamus), maka nama "Fungsi Pabrik" dalam dokumentasi.sumber
defaultdict(lambda: 0)
bukandefaultdict(int)
karena saya pikir itu lebih jelas apa yang terjadi; pembaca tidak perlu tahu Anda dapatkan0
jika Anda meneleponint()
tanpa argumen. YMMV.Untuk mendapatkan ide bagaimana melakukannya, pertama-tama kita memeriksa metode apa yang bisa kita panggil dalam kamus. Berikut adalah metodenya:
Metode brutal untuk memeriksa apakah kunci sudah ada mungkin
get()
metode:Dua metode lain yang menarik
items()
dankeys()
kedengarannya seperti terlalu banyak pekerjaan. Jadi mari kita periksa apakahget()
metode yang tepat untuk kita. Kami memiliki dict kamid
:Pencetakan menunjukkan kunci yang tidak kita miliki akan kembali
None
:Kami
dapatmenggunakannya untuk mendapatkan info jika kunci ada atau tidak. Tetapi pertimbangkan ini jika kita membuat dict dengan satukey:None
:Memimpin
get()
metode itu tidak dapat diandalkan jika beberapa nilai mungkinNone
. Kisah ini seharusnya memiliki akhir yang lebih bahagia. Jika kita menggunakanin
pembanding:Kami mendapatkan hasil yang benar. Kami dapat memeriksa kode byte Python:
Ini menunjukkan bahwa
in
operator pembanding tidak hanya lebih andal tetapi bahkan lebih cepat daripadaget()
.sumber
.get()
dapat memiliki argumen kedua untukdefault
nilai, yang bisa digunakan untuk menangani masalah di manakey:None
. contoh:d.get("key", False)
.get()
adalah cara tercepat. Pilihan lain adalah untuk menetapkan ditry
/except
blockKamus Python memiliki metode yang disebut
__contains__
. Metode ini akan mengembalikan True jika kamus memiliki kunci lain mengembalikan False.sumber
__contains__
langsung. Cara yang benar untuk melakukannya, adalah menggunakanin
operator, yangcontainment check
memanggil__contains__
fungsi.foo = x['foo'] if x.__contains__('foo') else 'bar'
. Adakah ide bagaimana menggunakanin
operator sebagai bagian dari ungkapan ini?foo = x['foo'] if 'foo' in x else 'bar'
Berbagi satu lagi cara memeriksa apakah ada kunci menggunakan operator boolean.
Ini kembali
Penjelasan
Pertama, Anda harus tahu bahwa di Python,
0
,None
, atau benda dengan panjang nol mengevaluasiFalse
. Segala sesuatu yang lain dievaluasiTrue
. Operasi Boolean dievaluasi dari kiri ke kanan dan mengembalikan operan tidak Benar atau Salah.Mari kita lihat sebuah contoh:
Sejak
'Some string'
mengevaluasi hinggaTrue
, sisanyaor
tidak dievaluasi dan tidak ada pembagian dengan kesalahan nol yang diajukan.Tetapi jika kita beralih, urutannya
1/0
dievaluasi terlebih dahulu dan menimbulkan pengecualian:Kita bisa menggunakan ini untuk pola untuk memeriksa apakah ada kunci.
melakukan hal yang sama dengan
Ini sudah mengembalikan hasil yang benar jika kunci ada, tetapi kami ingin itu mencetak 'boo' ketika tidak. Jadi, kami ambil hasilnya dan
or
dengan'boo'
sumber
Anda dapat menggunakan
for
loop untuk beralih ke kamus dan mendapatkan nama kunci yang ingin Anda temukan di kamus, setelah itu periksa apakah ada atau tidak menggunakanif
kondisi:sumber
it is exist
dannot exist