좋은 답변이 많이 있지만 한 가지만 강조하고 싶습니다.
둘 다 사용할 수있는 dict.pop()
방법 및보다 일반적인 del
문을 사전에서 항목을 제거 할 수 있습니다. 둘 다 원래 사전을 변경하므로 복사해야합니다 (아래 세부 사항 참조).
그리고 그들에게 KeyError
제공하는 키가 사전에 없으면 두 가지 모두 a를 발생시킵니다.
key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove] # Raises `KeyError: 'c'`
과
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove) # Raises `KeyError: 'c'`
당신은 이것을 처리해야합니다 :
예외를 캡처하여 :
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)
과
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)
확인을 수행하여 :
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
del d[key_to_remove]
과
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
d.pop(key_to_remove)
그러나 pop()
훨씬 더 간결한 방법이 있습니다-기본 반환 값을 제공하십시오.
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None) # No `KeyError` here
pop()
키 값을 제거하기 위해 사용하지 않는 한 필요하지 않은 것을 제공 할 수 있습니다 None
. 검사 del
와 함께 사용 하면 오버 헤드를 일으키는 자체 합병증이있는 기능 으로 인해 약간 빠릅니다 . 일반적으로 그렇지 않으므로 기본값으로 충분합니다.in
pop()
pop()
주요 질문에 대해서는 사전 사전을 복사하여 원래 사전을 저장하고 키를 제거하지 않고 새 사전을 만들어야합니다.
여기에있는 다른 사람들은을 사용하여 전체 (깊은) 복사본을 만들 것을 제안 copy.deepcopy()
합니다. 이는 과잉 copy.copy()
이거나 "보통"(얕은) 복사본 이거나 또는를 사용하는 dict.copy()
것으로 충분할 수 있습니다. 사전은 객체에 대한 참조를 키 값으로 유지합니다. 따라서 사전에서 키를 제거하면 참조되는 객체가 아니라이 참조가 제거됩니다. 메모리에 객체에 대한 다른 참조가 없으면 가비지 수집기에서 객체 자체를 나중에 자동으로 제거 할 수 있습니다. 딥 카피를 만들려면 얕은 카피에 비해 더 많은 계산이 필요하므로 카피를 만들고 메모리를 낭비하며 GC에 더 많은 작업을 제공하여 코드 성능이 떨어지며 때로는 카피가 충분합니다.
그러나 변경 가능한 객체를 사전 값으로 가지고 나중에 키없이 반환 된 사전에서 수정하려는 경우 딥 카피를 만들어야합니다.
얕은 사본으로 :
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}
깊은 사본으로 :
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}