安全地从字典中删除多个键

我知道要从字典d删除一个条目“key”,安全地,你需要:

 if d.has_key('key'): del d['key'] 

但是,我需要安全地从字典中删除多个条目。 我正在考虑定义元组中的条目,因为我将不止一次地这样做。

 entitiesToREmove = ('a', 'b', 'c') for x in entitiesToRemove: if d.has_key(x): del d[x] 

但是,我想知道是否有一个更聪明的方法来做到这一点?

为什么不这样做:

 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] 
 d = {'some':'data'} entriesToRemove = ('any', 'iterable') for k in entriesToRemove: d.pop(k, None) 

使用词典理解

 final_dict = {key: t[key] for key in t if key not in [key1, key2]} 

key1key2将被删除。

在下面的例子中,键“b”和“c”将被删除并保存在键列表中。

 >>> 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} >>> 

如果你还需要检索你正在移除的键的值,这将是一个很好的方法来做到这一点:

 valuesRemoved = [d.pop(k, None) for k in entitiesToRemove] 

你当然也可以这样做,只是为了从d删除键,但是你会不必要地使用列表理解来创build值列表。 仅仅为了函数的副作用而使用列表理解也是有点不清楚的。

一个解决scheme是使用mapfilterfunction

python2

 d={"a":1,"b":2,"c":3} l=("a","b","d") map(d.__delitem__, filter(d.__contains__,l)) print(d) 

python3

 d={"a":1,"b":2,"c":3} l=("a","b","d") list(map(d.__delitem__, filter(d.__contains__,l))) print(d) 

你得到:

 {'c': 3} 

我对任何现有的答案都没有问题,但我很惊讶没有find这个解决scheme:

 keys_to_remove = ['a', 'b', 'c'] my_dict = {k: v for k, v in zip("abcdefg".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} 

注:我偶然发现这个问题来自这里 。 我的答案与这个答案有关 。

为什么不:

 entriestoremove = (2,5,1) for e in entriestoremove: if d.has_key(e): del d[e] 

我不知道“聪明的方式”是什么意思。 当然还有其他的方式,也许有字典理解:

 entriestoremove = (2,5,1) newdict = {x for x in d if x not in entriestoremove} 

一致

 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'}