Ada banyak jawaban yang bagus, tetapi saya ingin menekankan satu hal.
Anda dapat menggunakan dict.pop()
metode dan del
pernyataan yang lebih umum untuk menghapus item dari kamus. Keduanya mengubah kamus asli, jadi Anda perlu membuat salinan (lihat detail di bawah).
Dan keduanya akan menaikkan KeyError
jika kunci yang Anda berikan kepada mereka tidak ada dalam kamus:
key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove] # Raises `KeyError: 'c'`
dan
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove) # Raises `KeyError: 'c'`
Anda harus mengurus ini:
dengan menangkap pengecualian:
key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
del d[key_to_remove]
except KeyError as ex:
print("No such key: '%s'" % ex.message)
dan
key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
d.pop(key_to_remove)
except KeyError as ex:
print("No such key: '%s'" % ex.message)
dengan melakukan pemeriksaan:
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
del d[key_to_remove]
dan
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
d.pop(key_to_remove)
tetapi dengan pop()
ada juga cara yang jauh lebih ringkas - memberikan nilai pengembalian default:
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None) # No `KeyError` here
Kecuali Anda menggunakan pop()
untuk mendapatkan nilai kunci yang dihapus Anda dapat memberikan apa pun, tidak perlu None
. Meskipun mungkin menggunakan del
dengan in
memeriksa sedikit lebih cepat karena pop()
menjadi fungsi dengan komplikasinya sendiri yang menyebabkan overhead. Biasanya tidak demikian, sehingga pop()
dengan nilai default cukup baik.
Sedangkan untuk pertanyaan utama, Anda harus membuat salinan kamus Anda, untuk menyimpan kamus asli dan memiliki yang baru tanpa kunci dihapus.
Beberapa orang lain di sini menyarankan untuk membuat salinan lengkap (dalam) copy.deepcopy()
, yang mungkin berlebihan, salinan "normal" (dangkal), menggunakan copy.copy()
atau dict.copy()
, mungkin cukup. Kamus menyimpan referensi ke objek sebagai nilai untuk kunci. Jadi ketika Anda menghapus kunci dari kamus referensi ini dihapus, bukan objek yang direferensikan. Objek itu sendiri dapat dihapus nanti secara otomatis oleh pengumpul sampah, jika tidak ada referensi lain untuk itu di memori. Membuat salinan yang dalam membutuhkan lebih banyak perhitungan dibandingkan dengan salinan yang dangkal, sehingga mengurangi kinerja kode dengan membuat salinan, membuang-buang memori dan memberikan lebih banyak pekerjaan ke GC, kadang-kadang salinan yang dangkal sudah cukup.
Namun, jika Anda memiliki objek yang bisa berubah-ubah sebagai nilai kamus dan berencana untuk mengubahnya nanti di kamus yang dikembalikan tanpa kunci, Anda harus membuat salinan yang dalam.
Dengan salinan dangkal:
def get_dict_wo_key(dictionary, key):
"""Returns a **shallow** copy of the dictionary without a key."""
_dict = dictionary.copy()
_dict.pop(key, None)
return _dict
d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"
new_d = get_dict_wo_key(d, key_to_remove)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d) # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d) # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2222}
Dengan salinan dalam:
from copy import deepcopy
def get_dict_wo_key(dictionary, key):
"""Returns a **deep** copy of the dictionary without a key."""
_dict = deepcopy(dictionary)
_dict.pop(key, None)
return _dict
d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"
new_d = get_dict_wo_key(d, key_to_remove)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2222}