Saya tahu untuk menghapus entri, 'kunci' dari kamus saya d
, dengan aman, Anda melakukannya:
if d.has_key('key'):
del d['key']
Namun, saya perlu menghapus beberapa entri dari kamus dengan aman. Saya sedang berpikir untuk mendefinisikan entri dalam tupel karena saya perlu melakukan ini lebih dari sekali.
entitiesToREmove = ('a', 'b', 'c')
for x in entitiesToRemove:
if d.has_key(x):
del d[x]
Namun, saya bertanya-tanya apakah ada cara yang lebih cerdas untuk melakukan ini?
python
dictionary
dublintech.dll
sumber
sumber
key in d
lebih Pythonic daripadad.has_key(key)
stackoverflow.com/questions/1323410/has-key-or-infor x in set(d) & entities_to_remove: del d[x]
. Ini mungkin hanya akan lebih efisien jikaentities_to_remove
"besar".Jawaban:
Kenapa tidak seperti ini:
Versi yang lebih ringkas disediakan oleh mattbornski menggunakan dict.pop ()
sumber
del dict['key1'], dict['key2'], dict['key3']
for key in set(the_dict) & entries:
dan melewatikey in dict
pengujian.sumber
dict.pop()
menghilangkan kebutuhan untuk pengujian keberadaan kunci. Luar biasa..pop()
itu buruk dan unpythonic, dan lebih suka jawaban yang diterima daripada yang ini.setdefault
. Jika diimplementasikan dengan benar (dan saya yakin itu), itu hanya melakukan satu pencarian ke dalam peta-hash yaitudict
, bukan dua.Menggunakan Dict Comprehensions
di mana key1 dan key2 harus dihapus.
Pada contoh di bawah ini, kunci "b" dan "c" harus dihapus & disimpan dalam daftar kunci.
sumber
O(n)
. Seluruh operasi adalahO(mn)
, di manam
jumlah kunci di dikt dann
jumlah kunci di daftar. Saya sarankan menggunakan satu set{key1, key2}
, jika memungkinkan.solusi menggunakan
map
danfilter
fungsipython 2
python 3
Anda mendapatkan:
sumber
>>> d={"a":1,"b":2,"c":3} >>> l=("a","b","d") >>> map(d.__delitem__, filter(d.__contains__,l)) <map object at 0x10579b9e8> >>> print(d) {'a': 1, 'b': 2, 'c': 3}
list(map(d.__delitem__,filter(d.__contains__,l)))
.... di python 3.4 fungsi peta mengembalikan iteratordeque(map(...), maxlen=0)
untuk menghindari membangun daftar nilai Tidak Ada; impor pertama denganfrom collections import deque
Jika Anda juga perlu mengambil nilai untuk kunci yang Anda hapus, ini akan menjadi cara yang cukup baik untuk melakukannya:
Anda tentu saja masih dapat melakukan ini hanya untuk menghapus kunci dari
d
, tetapi Anda tidak perlu membuat daftar nilai dengan pemahaman daftar. Juga agak tidak jelas untuk menggunakan pemahaman daftar hanya untuk efek samping fungsi.sumber
valuesRemoved = dict((k, d.pop(k, None)) for k in entitiesToRemove)
dan seterusnya.Menemukan solusi dengan
pop
danmap
Output dari ini:
Saya telah menjawab pertanyaan ini sangat terlambat hanya karena saya pikir akan membantu di masa depan jika ada yang mencari hal yang sama. Dan ini mungkin bisa membantu.
Memperbarui
Kode di atas akan memunculkan kesalahan jika kunci tidak ada di dict.
keluaran:
sumber
keys
dalamd
- Anda harus memfilternya terlebih dahulu.Saya tidak memiliki masalah dengan jawaban yang ada, tetapi saya terkejut tidak menemukan solusi ini:
Catatan: Saya menemukan pertanyaan ini datang dari sini . Dan jawaban saya terkait dengan jawaban ini .
sumber
Kenapa tidak:
Saya tidak tahu apa yang Anda maksud dengan "cara yang lebih cerdas". Tentunya ada cara lain, mungkin dengan pemahaman kamus:
sumber
Di barisan
sumber
Beberapa tes waktu untuk cpython 3 menunjukkan bahwa perulangan for yang sederhana adalah cara tercepat, dan cukup mudah dibaca. Menambahkan fungsi juga tidak menyebabkan banyak overhead:
hasil timeit (10k iterasi):
all(x.pop(v) for v in r) # 0.85
all(map(x.pop, r)) # 0.60
list(map(x.pop, r)) # 0.70
all(map(x.__delitem__, r)) # 0.44
del_all(x, r) # 0.40
<inline for loop>(x, r) # 0.35
Untuk iterasi kecil, melakukan 'inline' itu sedikit lebih cepat, karena overhead pemanggilan fungsi. Tapi
del_all
aman untuk lint, dapat digunakan kembali, dan lebih cepat dari semua pemahaman python dan konstruksi pemetaan.sumber
Saya pikir menggunakan fakta bahwa kunci dapat diperlakukan sebagai satu set adalah cara terbaik jika Anda menggunakan python 3:
Contoh:
sumber
Alangkah baiknya memiliki dukungan penuh untuk metode set untuk kamus (dan bukan kekacauan tidak suci yang kita dapatkan dengan Python 3.9) sehingga Anda bisa "menghapus" satu set kunci. Namun, selama bukan itu masalahnya, dan Anda memiliki kamus besar dengan kemungkinan sejumlah besar kunci untuk dihapus, Anda mungkin ingin tahu tentang kinerjanya. Jadi, saya telah membuat beberapa kode yang membuat sesuatu yang cukup besar untuk perbandingan yang bermakna: matriks 100.000 x 1000, jadi total 10.000,00 item.
10 juta item atau lebih bukanlah hal yang aneh di beberapa pengaturan. Membandingkan dua metode pada mesin lokal saya, saya melihat sedikit peningkatan saat menggunakan
map
danpop
, mungkin karena panggilan fungsi yang lebih sedikit, tetapi keduanya memakan waktu sekitar 2,5 detik pada mesin saya. Tapi ini artinya jika dibandingkan dengan waktu yang dibutuhkan untuk membuat kamus di tempat pertama (55-an), atau termasuk pemeriksaan dalam loop. Jika ini mungkin terjadi, sebaiknya buat set yang merupakan perpotongan dari kunci kamus dan filter Anda:keys = cells.keys() & keys
Singkatnya:
del
sudah sangat dioptimalkan, jadi jangan khawatir tentang menggunakannya.sumber
Saya terlambat untuk diskusi ini tetapi untuk orang lain. Solusinya mungkin dengan membuat daftar kunci seperti itu.
Kemudian gunakan pop () dalam pemahaman daftar, atau for loop, untuk mengulang tombol dan pop satu per satu.
'N / a' adalah jika kunci tidak ada, nilai default perlu dikembalikan.
sumber
new_dictionary
terlihat sangat banyak seperti daftar;)