Çok güzel cevaplar var, ama bir şeyi vurgulamak istiyorum.
Sözlükteki öğeleri kaldırmak için hem dict.pop()
yöntemi hem de daha genel bir del
ifadeyi kullanabilirsiniz. Her ikisi de orijinal sözlüğü değiştirir, bu nedenle bir kopya oluşturmanız gerekir (aşağıdaki ayrıntılara bakın).
Ve her ikisi de, onlara KeyError
sağladığınız anahtar sözlükte yoksa:
key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove] # Raises `KeyError: 'c'`
ve
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove) # Raises `KeyError: 'c'`
Bununla ilgilenmelisin:
istisnayı yakalayarak:
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)
ve
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)
bir çek yaparak:
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
del d[key_to_remove]
ve
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
d.pop(key_to_remove)
ancak pop()
çok daha kısa bir yol da var - varsayılan dönüş değerini belirtin:
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None) # No `KeyError` here
pop()
Kaldırılmakta olan bir anahtarın değerini almak için kullanmadığınız sürece , gerekli olmayan herhangi bir şey sağlayabilirsiniz None
. O kullanarak bu olabilir rağmen del
ile in
kontrol olduğunu biraz daha hızlı nedeniyle pop()
kendi komplikasyonlar havai neden olan bir fonksiyon olmak. Genellikle durum böyle değildir, bu nedenle pop()
varsayılan değer yeterli.
Ana soruya gelince, orijinal sözlüğü kaydetmek ve anahtar kaldırılmadan yeni bir tane edinmek için sözlüğünüzün bir kopyasını oluşturmanız gerekir.
Buradaki diğer bazı kişiler copy.deepcopy()
, bir overkill, "normal" (sığ) bir kopyayla, tam veya (derin) bir kopya almayı önerir copy.copy()
veya veya kullanarak dict.copy()
yeterli olabilir. Sözlük, nesneye yapılan başvuruyu bir anahtarın değeri olarak tutar. Dolayısıyla, bir sözlükten bir anahtarı kaldırdığınızda, referans alınan nesne değil, bu referans kaldırılır. Bellekte başka bir referans yoksa, nesnenin kendisi daha sonra çöp toplayıcı tarafından otomatik olarak kaldırılabilir. Derin bir kopya yapmak sığ kopyaya göre daha fazla hesaplama gerektirir, bu nedenle kopya yaparak, belleği boşa harcayarak ve GC'ye daha fazla çalışma sağlayarak kod performansını düşürür, bazen sığ kopya yeterlidir.
Ancak, sözlük değerleri olarak değiştirilebilir nesneleriniz varsa ve bunları daha sonra döndürülen sözlükte anahtar olmadan değiştirmeyi planlıyorsanız, derin bir kopya oluşturmanız gerekir.
Sığ kopya ile:
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}
Derin kopya ile:
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}