Apa cara terbaik untuk menghapus item dari kamus berdasarkan nilai, yaitu ketika kunci item tidak diketahui? Inilah pendekatan sederhana:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Apakah ada cara yang lebih baik? Apakah ada yang salah dengan mutasi (menghapus item) dari kamus saat mengulanginya?
python
dictionary
Kancing 840
sumber
sumber
Jawaban:
Ketahuilah bahwa Anda saat ini menguji identitas objek (
is
hanya mengembalikanTrue
jika kedua operan diwakili oleh objek yang sama di memori - tidak selalu demikian dengan dua objek yang dibandingkan sama==
). Jika Anda melakukan ini dengan sengaja, maka Anda dapat menulis ulang kode Anda sebagaiTetapi ini mungkin tidak melakukan apa yang Anda inginkan:
Jadi, Anda mungkin menginginkannya,
!=
bukanis not
.sumber
some_dict.iteritems()
sini dan meletakkanfor
danif
pernyataan pada baris terpisah agar mudah dibacaiteritems
sekarangitems
. Di Python 2.7,iteritems()
memang lebih baik.dict()
dengan ekspresi generator yang sesuai, yaitu 2.4. meta: dapat menelusuri peps di sini untuk mencari tahu.The
dict.pop(key[, default])
Metode memungkinkan Anda untuk menghapus item ketika Anda tahu kuncinya. Ia mengembalikan nilai pada kunci jika menghapus item, jika tidak ia mengembalikan apa yang diteruskan sebagaidefault
. Lihat dokumennya . 'Contoh:
sumber
sumber
Perbandingan sederhana antara del dan pop () :
hasil:
Jadi, del lebih cepat dari pop () .
sumber
pop()
(seperti yang dilakukan @ n-1-1 di atas) - yang bukan merupakan opsi untukdel
operator.timeit
. Terima kasih atas contoh yang jelas ini.items()
mengembalikan daftar, dan itu adalah daftar yang Anda iterasi, jadi mutasi dict di loop tidak masalah di sini. Jika Anda menggunakaniteritems()
sebagai gantinya, mutasi dict dalam loop akan menjadi masalah , dan juga untukviewitems()
Python 2.7.Saya tidak bisa memikirkan cara yang lebih baik untuk menghapus item dari dict by value.
sumber
Saya akan membuat daftar kunci yang perlu dihapus, lalu menghapusnya. Sederhana, efisien, dan menghindari masalah tentang pengulangan dan mutasi perintah secara bersamaan.
sumber
c adalah kamus baru, dan a adalah kamus asli Anda, {'z', 'w'} adalah kunci yang ingin Anda hapus dari
Periksa juga: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
sumber
sumber
Tidak ada yang salah dengan menghapus item dari kamus saat mengulang, seperti yang Anda usulkan. Berhati-hatilah dengan beberapa utas yang menggunakan kamus yang sama pada saat yang sama, yang dapat mengakibatkan KeyError atau masalah lainnya.
Tentu saja, lihat dokumen di http://docs.python.org/library/stdtypes.html#typesmapping
sumber
for k,v in d.iteritems(): del d[k]
akan memberiRuntimeError: dictionary changed size during iteration
. Simak penjelasan mithrandi.Beginilah cara saya melakukannya.
sumber