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