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

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

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

  • Почему dict.get (key) вместо dict ?
  • Приложить к диктору списков с пониманием dict
  • Структура данных для реализации словаря с несколькими индексами?
  • как заказать словарь python (сортировка)
  • Python: Элегантно объединить словари с суммой () значений
  • Ключевой порядок в словарях Python
  • Сравнение скорости доступа к словарю с целым ключом от строкового ключа
  • Использование Python для извлечения словарных ключей в списке
  • 8 Solutions collect form web for “Безопасное удаление нескольких ключей из словаря”

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

     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) 

    Использование 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} >>> 

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

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

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

    решение использует функции 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} 

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

     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'} 
    Python - лучший язык программирования в мире.