Saat menghapus kunci dari kamus, saya menggunakan:
if 'key' in my_dict:
del my_dict['key']
Apakah ada satu cara untuk melakukan ini?
Saat menghapus kunci dari kamus, saya menggunakan:
if 'key' in my_dict:
del my_dict['key']
Apakah ada satu cara untuk melakukan ini?
Jawaban:
Untuk menghapus kunci terlepas dari apakah itu ada di kamus, gunakan bentuk dua argumen
dict.pop()
:Ini akan kembali
my_dict[key]
jikakey
ada di kamus, danNone
sebaliknya. Jika parameter kedua tidak ditentukan (mis.my_dict.pop('key')
) Dankey
tidak ada, aKeyError
dinaikkan.Untuk menghapus kunci yang dijamin ada, Anda juga bisa menggunakan
Ini akan menaikkan a
KeyError
jika kunci tidak ada dalam kamus.sumber
pop()
lebihdel
: mengembalikan nilai untuk kunci itu. Dengan cara ini Anda bisa mendapatkan dan menghapus entri dari dict dalam satu baris kode.try
/except
solusi jika kuncinya tidak ada. Anda mungkin menemukan satu atau yang lain lebih mudah dibaca, yang baik-baik saja. Keduanya adalah Python idiomatik, jadi pilihlah apa pun yang Anda inginkan. Tetapi mengklaim bahwa jawaban ini lebih kompleks atau tidak efisien sama sekali tidak masuk akal.self
, jadi akan agak mengejutkan jika yang ini melakukannya.Khusus untuk menjawab, "Apakah ada satu cara untuk melakukan ini?"
... yah, kamu bertanya ;-)
Namun, Anda harus mempertimbangkan bahwa cara menghapus objek dari a
dict
ini bukan atomik — itu'key'
mungkin terjadi padamy_dict
saatif
pernyataan, tetapi dapat dihapus sebelumdel
dieksekusi, dalam hal inidel
akan gagal dengan aKeyError
. Mengingat ini, akan lebih aman untuk menggunakandict.pop
atau sesuatu di sepanjang garisyang, tentu saja, jelas bukan one-liner.
sumber
pop
pasti lebih ringkas, meskipun ada satu keuntungan utama dari melakukannya dengan cara ini: segera jelas apa yang dilakukannya.try/except
pernyataan lebih mahal. Memunculkan pengecualian lambat.try
sedikit lebih cepat, meskipun jika tidak,try
memang jauh lebih lambat.pop
cukup konsisten tetapi lebih lambat dari semua tetapitry
dengan kunci yang tidak ada. Lihat gist.github.com/zigg/6280653 . Pada akhirnya, itu tergantung pada seberapa sering Anda mengharapkan kunci untuk benar-benar berada di kamus, dan apakah Anda memerlukan atomicity atau tidak, dan, tentu saja, apakah Anda terlibat dalam optimasi prematur;)if 'key' in mydict: #then del...
. Saya perlu mengeluarkan kunci / val dari dict untuk mengurai dengan benar, pop bukan solusi yang sempurna.Butuh beberapa waktu untuk mencari tahu apa yang sebenarnya
my_dict.pop("key", None)
dilakukan. Jadi saya akan menambahkan ini sebagai jawaban untuk menghemat waktu Googling orang lain:Dokumentasi
sumber
dict.pop?
dalam IPython.del my_dict[key]
sedikit lebih cepat daripadamy_dict.pop(key)
untuk menghapus kunci dari kamus ketika kunci adaTetapi ketika kuncinya tidak ada
if key in my_dict: del my_dict[key]
sedikit lebih cepat darimy_dict.pop(key, None)
. Keduanya setidaknya tiga kali lebih cepat daripadadel
dalamtry
/except
pernyataan:sumber
pop
adel
. Membuat kamus akan sepenuhnya menghapus barang-barang darinya.del
danpop
dari set pertama timing di atas)Jika Anda perlu menghapus banyak kunci dari kamus dalam satu baris kode, saya pikir menggunakan peta () cukup ringkas dan Pythonic dapat dibaca:
Dan jika Anda perlu menangkap kesalahan ketika Anda memberi nilai yang tidak ada dalam kamus, gunakan lambda inside map () seperti ini:
atau di
python3
, Anda harus menggunakan pemahaman daftar sebagai gantinya:Berhasil. Dan 'e' tidak menyebabkan kesalahan, meskipun myDict tidak memiliki kunci 'e'.
sumber
map
dan teman-teman sekarang malas dan mengembalikan iterators. Menggunakanmap
efek samping umumnya dianggap praktik buruk;for ... in
loop standar akan lebih baik. Lihat Tampilan dan Iterator Daripada Daftar untuk informasi lebih lanjut.[myDict.pop(i, None) for i in ['a', 'c']]
, karena mereka menawarkan alternatif umum untukmap
(danfilter
).for ... in
loop reguler .map()
, yang sering digunakan untuk efek sampingnya. Alternatif yang direkomendasikan dalam Python adalah daftar pemahaman, yang menurut saya masih cukup mudah dibaca dan secara kognitif ringan sebagai satu-liner (lihat pertanyaan). Hanya digunakan untuk efek sampingnya, kedua konstruksi tersebut memang menghasilkan daftar yang tidak berguna, yang dapat menjadi tidak efisien. Pada Python3, saya tidak mengetahui fungsi bawaan yang dapat dengan aman dan elegan diulang melalui ekspresi generator, tanpa misalnya produk sampingan yang mahalloop(d.pop(k) for k in ['a', 'b'])
.Anda dapat menggunakan pemahaman kamus untuk membuat kamus baru dengan kunci itu dihapus:
Anda dapat menghapus dengan ketentuan. Tidak ada kesalahan jika
key
tidak ada.sumber
Menggunakan kata kunci "del":
sumber
Kami dapat menghapus kunci dari kamus Python dengan beberapa pendekatan berikut.
Menggunakan
del
kata kunci; itu pendekatan yang hampir sama seperti yang Anda lakukan -Atau
Kita dapat melakukan hal-hal berikut:
Tetapi orang harus ingat bahwa, dalam proses ini sebenarnya itu tidak akan menghapus kunci apa pun dari kamus daripada membuat kunci spesifik dikecualikan dari kamus itu. Selain itu, saya mengamati bahwa itu mengembalikan kamus yang tidak dipesan sama dengan
myDict
.Jika kita menjalankannya di shell, ia akan menjalankan sesuatu seperti
{'five': 500, 'four': 400, 'three': 300, 'two': 200}
- perhatikan bahwa itu tidak sama dengan yang dipesanmyDict
. Sekali lagi jika kita mencoba untuk mencetakmyDict
, maka kita dapat melihat semua kunci termasuk yang kita kecualikan dari kamus dengan pendekatan ini. Namun, kita dapat membuat kamus baru dengan menetapkan pernyataan berikut ke dalam variabel:Sekarang jika kita mencoba mencetaknya, maka itu akan mengikuti perintah induk:
Atau
Menggunakan
pop()
metode.Perbedaan antara
del
danpop
apakah itu, menggunakanpop()
metode, kita sebenarnya dapat menyimpan nilai kunci jika diperlukan, seperti yang berikut:Hancurkan inti ini untuk referensi di masa mendatang, jika menurut Anda ini berguna.
sumber
if myDict.get('one')
untuk memeriksa apakah ada kunci! Gagal jika myDict ['one'] memiliki nilai falsey. Juga, dikte tidak memiliki urutan bawaan, jadi tidak masuk akal untuk menyebutkannya.Anda dapat menggunakan penanganan pengecualian jika Anda ingin menjadi sangat verbose:
Namun, ini lebih lambat daripada
pop()
metode ini, jika kuncinya tidak ada.Tidak masalah untuk beberapa tombol, tetapi jika Anda melakukan ini berulang kali, maka metode terakhir adalah taruhan yang lebih baik.
Pendekatan tercepat adalah ini:
Tetapi metode ini berbahaya karena jika
'key'
dihilangkan di antara dua garis,KeyError
akan dinaikkan.sumber
Saya lebih suka versi abadi
sumber
Cara lain adalah dengan Menggunakan item () + pemahaman dict
item () ditambah dengan pemahaman dict juga dapat membantu kami mencapai tugas penghapusan pasangan kunci-nilai tetapi, memiliki kelemahan karena tidak menjadi teknik dict tempat. Sebenarnya dict baru jika dibuat kecuali untuk kunci yang tidak ingin kami sertakan.
Keluaran:
sumber
Filter tunggal pada tombol
Beberapa filter pada tombol
sumber