Saya ingin memasukkan pasangan nilai-kunci ke dalam dict jika kunci tidak ada di dict.keys (). Pada dasarnya saya bisa melakukannya dengan:
if key not in d.keys():
d[key] = value
Tapi apakah ada cara yang lebih baik? Atau apa solusi pythonic untuk masalah ini?
python
dictionary
Xiaochen Cui
sumber
sumber
Jawaban:
Anda tidak perlu menelepon
d.keys()
, jadiif key not in d: d[key] = value
cukup. Tidak ada metode yang lebih jelas dan lebih mudah dibaca.
Anda bisa memperbarui lagi dengan
dict.get()
, yang akan mengembalikan nilai yang ada jika kunci sudah ada:tetapi saya sangat menyarankan untuk tidak melakukannya; ini adalah kode golf, menghambat pemeliharaan dan keterbacaan.
sumber
Penggunaan
dict.setdefault()
:>>> d = {1: 'one'} >>> d.setdefault(1, '1') 'one' >>> d # d has not changed because the key already existed {1: 'one'} >>> d.setdefault(2, 'two') 'two' >>> d {1: 'one', 2: 'two'}
sumber
dict.setdefault()
sebaiknya hanya digunakan saat mencoba mengakses nilai juga.setdefault()
dengan jelas menggambarkan apa yang terjadi - bahwa ia juga mengembalikan nilai yang tidak terlalu penting, dan IMO yang sedikit unik. Bisakah Anda memberikan penjelasan singkat, atau tautan ke salah satunya, mengapa hal ini tidak diinginkan?for obj in iterable: d.setdefault(key_for_obj(obj), []).append(obj)
. Tidak ada yang aneh tentang nilai yang dikembalikan, itulah inti dari metode ini .if key not in d:
tes.setdefault()
sepertinya memang sesuai dengan apa yang Anda katakan. Menggunakan adefaultdict(list)
akan menghasilkan kode yang lebih mudah dibaca daripada contoh Anda ... jadi mungkin tidak ada gunanya kecuali seseorang harus bekerja dengan kamus standar. Secara keseluruhan,if key not in d
lebih jelas.Sejak Python 3.9 Anda dapat menggunakan operator
|
penggabungan untuk menggabungkan dua kamus. Dikt di sebelah kanan diutamakan:Sebagai contoh:
new_dict = { 'a': 1, 'b': 2 } | { 'b': 42 } print(new_dict} # {'a': 1, 'b': 42}
Catatan: ini membuat kamus baru dengan nilai yang diperbarui.
sumber
Dengan berikut ini Anda dapat menyisipkan beberapa nilai dan juga memiliki nilai default tetapi Anda sedang membuat kamus baru.
Saya telah mengujinya dengan jawaban yang paling banyak dipilih dan rata-rata ini lebih cepat seperti yang dapat dilihat pada contoh berikut,.
Tes kecepatan membandingkan metode berbasis loop dengan pemahaman dict dengan metode operator unpack.
jika tidak ada salinan (
d = default_vals.copy()
) yang dibuat pada kasus pertama maka jawaban yang paling banyak dipilih akan lebih cepat setelah kita mencapai urutan besarnya10**5
dan lebih besar. Jejak memori kedua metode itu sama.sumber
{**default_values, **{ key: value }}
Menurut jawaban di atas metode setdefault () bekerja untuk saya.
old_attr_name = mydict.setdefault(key, attr_name) if attr_name != old_attr_name: raise RuntimeError(f"Key '{key}' duplication: " f"'{old_attr_name}' and '{attr_name}'.")
Padahal solusi ini tidak generik. Hanya cocok untukku dalam kasus tertentu ini. Solusi yang tepat akan memeriksa yang
key
pertama (seperti yang telah disarankan), tetapi dengansetdefault()
kita menghindari satu pencarian tambahan di kamus, yaitu, meskipun kecil, tetapi masih merupakan peningkatan kinerja.sumber