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

我知道删除一个条目,'键' 从我的字典d,安全,你做:

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

但是,我需要安全地从字典中删除多个条目。 我正在考虑在元组中定义条目,因为我需要不止一次地执行此操作。

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

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

dublintech asked 2019-08-13T04:37:13Z
11个解决方案
182 votes
d = {'some':'data'}
entriesToRemove = ('any', 'iterable')
for k in entriesToRemove:
    d.pop(k, None)
mattbornski answered 2019-08-13T04:37:49Z
72 votes

使用Dict理解

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

其中key1和key2将被删除。

在下面的示例中,键" 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}
>>> 
Abhijeet Rastogi answered 2019-08-13T04:38:29Z
37 votes

为什么不这样:

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()提供了更紧凑的版本

Glaslos answered 2019-08-13T04:37:32Z
17 votes

如果您还需要检索要删除的键的值,这将是一个非常好的方法:

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

您当然可以仅仅为了从d中删除密钥来执行此操作,但是您将不必要地使用列表推导创建值列表。 仅仅为了函数的副作用使用列表理解也有点不清楚。

Andrew Clark answered 2019-08-13T04:39:02Z
13 votes

解决方案是使用mapfilter功能

python 2

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

蟒蛇3

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

你得到:

{'c': 3}
Jose Ricardo Bustos M. answered 2019-08-13T04:39:42Z
4 votes

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

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}

注意:我偶然发现了这里提出的问题。 我的回答与这个答案有关。

Doug R. answered 2019-08-13T04:40:14Z
3 votes

找到了一个popmap的解决方案

d = {'a': 'valueA', 'b': 'valueB', 'c': 'valueC', 'd': 'valueD'}
keys = ['a', 'b', 'c']
list(map(d.pop, keys))
print(d)

这个输出:

{'d': 'valueD'}

我这么晚才回答这个问题只是因为我认为如果有人搜索同样的话,将会有所帮助。 这可能会有所帮助。

更新

如果dict中不存在键,则上面的代码将抛出错误。

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)

输出:

DICTIONARY = {'b': 'valueB', 'd': 'valueD'}
Shubham Srivastava answered 2019-08-13T04:41:05Z
2 votes

为什么不:

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}
L3viathan answered 2019-08-13T04:41:33Z
2 votes

排队

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'}
chuang wang answered 2019-08-13T04:41:58Z
0 votes

我认为如果你在python 3上使用密钥可以被视为一个集合的事实是最好的方法:

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

例:

>>> remove_keys({'k1': 1, 'k3': 3}, ['k1', 'k2'])
{'k3': 3}
Reut Sharabani answered 2019-08-13T04:42:26Z
-1 votes

我讨论的时间比我迟到了。 解决方案可以是创建密钥列表。

k = ['a','b','c','d']

然后在列表推导或for循环中使用pop()迭代键并一次弹出一个键。

new_dictionary = [dictionary.pop(x, 'n/a') for x in k]

' n / a' 如果密钥不存在,则需要返回默认值。

Terrance DeJesus answered 2019-08-13T04:43:06Z
translate from https://stackoverflow.com:/questions/8995611/removing-multiple-keys-from-a-dictionary-safely