Removing multiple keys from a dictionary safely
我知道要从我的字典中删除一个条目"key",
1 2 | if d.has_key('key'): del d['key'] |
但是,我需要从字典中安全地删除多个条目。我考虑在元组中定义条目,因为我需要多次这样做。
1 2 3 4 | entitiesToREmove = ('a', 'b', 'c') for x in entitiesToRemove: if d.has_key(x): del d[x] |
然而,我想知道是否有一种更聪明的方法来做到这一点?
1 2 3 4 | d = {'some':'data'} entriesToRemove = ('any', 'iterable') for k in entriesToRemove: d.pop(k, None) |
使用听写理解
1 | final_dict = {key: t[key] for key in t if key not in [key1, key2]} |
移除键1和键2的位置。
在下面的示例中,要删除键"b"和"c",并将其保存在键列表中。
1 2 3 4 5 6 | >>> a {'a': 1, 'c': 3, 'b': 2, 'd': 4} >>> keys = ["b","c"] >>> print {key: a[key] for key in a if key not in keys} {'a': 1, 'd': 4} >>> |
为什么不这样:
1 2 3 4 5 6 7 | entries = ('a', 'b', 'c') the_dict = {'b': 'foo'} def entries_to_remove(entries, the_dict): for key in entries: if key in the_dict: del the_dict[key] |
Mattbornski使用dict.pop()提供了更紧凑的版本
如果还需要检索要删除的键的值,这将是一种非常好的方法:
1 | valuesRemoved = [d.pop(k, None) for k in entitiesToRemove] |
当然,您仍然可以这样做,只是为了从
解决方案是使用
Python 2
1 2 3 4 | d={"a":1,"b":2,"c":3} l=("a","b","d") map(d.__delitem__, filter(d.__contains__,l)) print(d) |
Python 3
1 2 3 4 | d={"a":1,"b":2,"c":3} l=("a","b","d") list(map(d.__delitem__, filter(d.__contains__,l))) print(d) |
你得到:
1 | {'c': 3} |
我对任何现有的答案都没有问题,但是我很惊讶地发现没有这个解决方案:
1 2 3 4 5 6 7 8 9 10 | keys_to_remove = ['a', 'b', 'c'] my_dict = {k: v for k, v in zip("a b c d e f g".split(' '), [0, 1, 2, 3, 4, 5, 6])} for k in keys_to_remove: try: del my_dict[k] except KeyError: pass assert my_dict == {'d': 3, 'e': 4, 'f': 5, 'g': 6} |
注意:我偶然发现这个问题来自这里。我的答案和这个答案有关。
用
1 2 3 4 | d = {'a': 'valueA', 'b': 'valueB', 'c': 'valueC', 'd': 'valueD'} keys = ['a', 'b', 'c'] list(map(d.pop, keys)) print(d) |
此输出:
1 | {'d': 'valueD'} |
我这么晚才回答这个问题,只是因为我认为将来如果有人搜索这个问题会有所帮助。这可能会有所帮助。
更新
如果dict中不存在键,上述代码将引发错误。
1 2 3 4 5 6 7 8 9 10 11 | DICTIONARY = {'a': 'valueA', 'b': 'valueB', 'c': 'valueC', 'd': 'valueD'} keys = ['a', 'l', 'c'] def remove_keys(key): try: DICTIONARY.pop(key, None) except: pass # or do any action list(map(remove_key, keys)) print(DICTIONARY) |
输出:
1 | DICTIONARY = {'b': 'valueB', 'd': 'valueD'} |
内联的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import functools #: not key(c) in d d = {"a":"avalue","b":"bvalue","d":"dvalue"} entitiesToREmove = ('a', 'b', 'c') #: python2 map(lambda x: functools.partial(d.pop, x, None)(), entitiesToREmove) #: python3 list(map(lambda x: functools.partial(d.pop, x, None)(), entitiesToREmove)) print(d) # output: {'d': 'dvalue'} |
为什么不:
1 2 3 4 | entriestoremove = (2,5,1) for e in entriestoremove: if d.has_key(e): del d[e] |
我不知道你所说的"更聪明的方式"是什么意思。当然还有其他的方法,也许是字典的理解:
1 2 | entriestoremove = (2,5,1) newdict = {x for x in d if x not in entriestoremove} |
我认为,如果您使用的是Python3,那么使用可以作为集合处理的键是最好的方法:
1 2 3 4 5 | def remove_keys(d, keys): to_remove = set(keys) filtered_keys = d.keys() - to_remove filtered_values = map(d.get, filtered_keys) return dict(zip(filtered_keys, filtered_values)) |
例子:
1 2 | >>> remove_keys({'k1': 1, 'k3': 3}, ['k1', 'k2']) {'k3': 3} |
我参加这次讨论迟到了,但对其他人来说。解决方案可能是创建一个键列表。
1 | k = ['a','b','c','d'] |
然后在列表理解或for循环中使用pop()迭代键,并一次弹出一个。
1 | new_dictionary = [dictionary.pop(x, 'n/a') for x in k] |
"n/a"是在该键不存在的情况下,需要返回默认值。