Подтвердить что ты не робот

Безопасное удаление нескольких ключей из словаря

Я знаю, чтобы удалить запись, "ключ" из моего словаря 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]

Однако мне было интересно, есть ли более разумный способ сделать это?

4b9b3361

Ответ 1

Почему бы не так:

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]

Более компактная версия была предоставлена матерборнски с использованием dict.pop()

Ответ 2

d = {'some':'data'}
entriesToRemove = ('any', 'iterable')
for k in entriesToRemove:
    d.pop(k, None)

Ответ 3

Использование Dict Comprehensions

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

Ответ 4

Если вам также необходимо получить значения для ключей, которые вы удаляете, это было бы неплохим способом:

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

Конечно, вы могли бы это сделать только для удаления ключей из d, но вам было бы необязательно создавать список значений со списком. Также немного непонятно использовать понимание списка только для побочного эффекта функции.

Ответ 5

решение использует функции map и filter

python 2

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

python 3

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

вы получаете:

{'c': 3}

Ответ 6

У меня нет проблем с любым из существующих ответов, но я был удивлен, когда не нашел это решение:

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}

Примечание. Я наткнулся на этот вопрос, исходящий из здесь. И мой ответ связан с этим ответом.

Ответ 7

Почему бы и нет:

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}

Ответ 8

рядный

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

Ответ 9

Я опаздываю на эту дискуссию, но для кого-то еще. Решением может быть создание списка ключей как таковых.

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

Затем используйте функцию pop() в понимании списка или для цикла, чтобы перебирать ключи и потивиться по одному как таковой.

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

"N/a" на тот случай, если ключ не существует, необходимо вернуть значение по умолчанию.

Ответ 10

Я опоздал, но нашел решение с pop map и map

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

Выход этого:

{'d': 'valueD'}