Delete an element from a dictionary
有没有办法从python的字典中删除一个条目?
此外,如何从字典中删除项目以返回副本(即,不修改原件)?
1 | del d[key] |
但是,这会改变现有词典,因此词典的内容会为引用同一实例的任何其他人而更改。要返回新词典,请复制词典:
1 2 3 4 | def removekey(d, key): r = dict(d) del r[key] return r |
请注意,为每一个dict制作一个副本
1 2 3 4 5 | >>>lol = {"hello":"gdbye <div class="suo-content">[collapse title=""]<ul><li>也适用于<wyn>lambda</wyn>(而<wyn>del</wyn>不适用)。</li><li>"del"还行,但"pop"在我看来更像是"Python"。</li><li>@伊万利昂茨为什么?</li><li><wyn>pop</wyn>返回"popped"的值,允许您出于任何进一步的原因使用该值。如果不是更多的"Python",我会说这似乎更好,当然:)。它不是一个dict,但对这两者的工作方式相同:github.com/ivanlmj/python-prototypes/blob/master/3.4/&hellip;</li></ul>[/collapse]</div><p><center>[wp_ad_camp_1]</center></p><hr><P>我认为你的解决方案是最好的方法。但是,如果需要其他解决方案,可以使用旧字典中的键创建新字典,而不包括指定的键,如下所示:</P>[cc lang="python"]>>> a {0: 'zero', 1: 'one', 2: 'two', 3: 'three'} >>> {i:a[i] for i in a if i!=0} {1: 'one', 2: 'two', 3: 'three'} |
del语句就是您要查找的内容。如果您有一个名为foo的字典,其中有一个名为"bar"的键,则可以从foo中删除"bar",如下所示:
1 | del foo['bar'] |
请注意,这将永久修改正在操作的字典。如果您想保留原始词典,必须事先创建一份副本:
1 2 3 4 5 6 7 | >>> foo = {'bar': 'baz'} >>> fu = dict(foo) >>> del foo['bar'] >>> print foo {} >>> print fu {'bar': 'baz'} |
为了方便起见,您可以复制和粘贴以下方法:
1 2 3 4 | def minus_key(key, dictionary): shallow_copy = dict(dictionary) del shallow_copy[key] return shallow_copy |
有很多不错的答案,但我想强调一件事。
您可以使用
如果你提供给他们的密钥不在字典中,他们两个都会提出一个
1 2 3 | key_to_remove ="c" d = {"a": 1,"b": 2} del d[key_to_remove] # Raises `KeyError: 'c'` |
和
1 2 3 | key_to_remove ="c" d = {"a": 1,"b": 2} d.pop(key_to_remove) # Raises `KeyError: 'c'` |
你必须处理好这件事:
通过捕获异常:
1 2 3 4 5 6 | 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) |
和
1 2 3 4 5 6 | 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) |
通过执行检查:
1 2 3 4 | key_to_remove ="c" d = {"a": 1,"b": 2} if key_to_remove in d: del d[key_to_remove] |
和
1 2 3 4 | key_to_remove ="c" d = {"a": 1,"b": 2} if key_to_remove in d: d.pop(key_to_remove) |
但是对于
1 2 3 | key_to_remove ="c" d = {"a": 1,"b": 2} d.pop(key_to_remove, None) # No `KeyError` here |
除非您使用
至于主要问题,你必须复制你的字典,保存原来的字典,并且在不取下键的情况下换一个新字典。
这里的一些人建议用
但是,如果您将可变对象作为字典值,并计划稍后在返回的字典中修改它们,而不使用键,则必须进行深度复制。
浅拷贝:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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} |
深拷贝:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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} |
1 2 3 | d = {1: 2, '2': 3, 5: 7} del d[5] print 'd = ', d |
结果:
… how can I delete an item from a dictionary to return a copy (i.e., not modifying the original)?
当然,复制听写和从复制中弹出都是有效的,构建一个理解力强的新听写也是有效的,但是所有的复制都需要时间,你已经用一个线性时间操作替换了一个固定时间操作。所有这些活拷贝一次就占用空间线性空间。
其他的数据结构,比如散列数组映射尝试,都是为这种用例而设计的:添加或删除一个元素会以对数时间返回一个副本,并与原始元素共享其大部分存储空间。1
当然也有一些缺点。性能是对数的,而不是常量(虽然底数很大,通常为32-128)。而且,虽然您可以使非变异API与
1 2 3 4 5 6 7 8 9 10 | >>> from pyrsistent import m >>> d1 = m(a=1, b=2) >>> d2 = d1.set('c', 3) >>> d3 = d1.remove('a') >>> d1 pmap({'a': 1, 'b': 2}) >>> d2 pmap({'c': 3, 'a': 1, 'b': 2}) >>> d3 pmap({'b': 2}) |
这正是问题所在。
如果在
>1。HAMTs在scala、clojure、haskell等语言中也很流行,因为它们非常适合无锁编程和软件事务性内存,但这两种语言在python中都不是非常相关的。
>2。实际上,stdlib中有一个hamt,用于
Simply call del d['key'].
However, in production, it is always a good practice to check if 'key' exists in d.
1 2 | if 'key' in d: del d['key'] |
不,除了
1 2 3 4 | def dictMinus(dct, val): copy = dct.copy() del copy[val] return copy |
然而,通常只创建稍微改动过的字典的副本可能不是一个好主意,因为这样会导致相对较大的内存需求。通常最好先记录旧字典(如果必要的话),然后再修改它。
1 2 3 4 5 6 7 8 | >>> def delete_key(dict, key): ... del dict[key] ... return dict ... >>> test_dict = {'one': 1, 'two' : 2} >>> print delete_key(test_dict, 'two') {'one': 1} >>> |
这不做任何错误处理,它假定密钥在dict中,您可能要检查first和
这里是顶层设计方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 | def eraseElement(d,k): if isinstance(d, dict): if k in d: d.pop(k) print(d) else: print("Cannot find matching key") else: print("Not able to delete") exp = {'A':34, 'B':55, 'C':87} eraseElement(exp, 'C') |
我正在将字典和我想要的键传递到我的函数中,验证它是否是字典,以及键是否正常,如果两者都存在,则从字典中删除值并打印出剩余部分。
输出:
希望有帮助!
下面的代码片段将绝对帮助您,我在每行中添加了注释,这将帮助您理解代码。
1 2 3 4 5 6 7 8 9 10 11 | def execute(): dic = {'a':1,'b':2} dic2 = remove_key_from_dict(dic, 'b') print(dict2) # {'a': 1} print(dict) # {'a':1,'b':2} def remove_key_from_dict(dictionary_to_use, key_to_delete): copy_of_dict = dict(dictionary_to_use) # creating clone/copy of the dictionary if key_to_delete in copy_of_dict : # checking given key is present in the dictionary del copy_of_dict [key_to_delete] # deleting the key from the dictionary return copy_of_dict # returning the final dictionary |
也可以使用dict.pop()。
1 2 3 4 | d = {"a": 1,"b": 2} res = d.pop("c") # No `KeyError` here print (res) # this line will not execute |
或者更好的方法是
1 2 3 4 5 6 7 | res = d.pop("c","key not found") print (res) # key not found print (d) # {"a": 1,"b": 2} res = d.pop("b","key not found") print (res) # 2 print (d) # {"a": 1} |
很好的一行代码,用于检查密钥是否存在、删除它、返回值或默认值:
1 | ret_val = ('key' in body and body.pop('key')) or 5 |
下面是另一个使用列表理解的变体:
1 2 3 | original_d = {'a': None, 'b': 'Some'} d = dict((k,v) for k, v in original_d.iteritems() if v) # result should be {'b': 'Some'} |
该方法基于本帖的答案:从dict中删除带有空字符串的键的有效方法