有很多不错的答案,但我想强调一件事。
您可以使用dict.pop() 方法和更通用的del statement 从字典中删除项目。它们都改变了原始字典,因此您需要制作一个副本(请参阅下面的详细信息)。
如果您提供给他们的密钥在字典中不存在,他们都会提出KeyError:
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}