Удалите элемент словаря, если ключ существует

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

if key in mydict:
    del mydict[key]

Сценарий заключается в том, что мне предоставляется коллекция ключей, которые нужно удалить из данного словаря, но я не уверен, что все они существуют в словаре. На всякий случай я пропустил более эффективное решение.

Ответ 1

Вы можете использовать dict.pop:

 mydict.pop("key", None)

Обратите внимание, что если второй аргумент, т.е. None не указан, KeyError возникает, если ключ не находится в словаре. Предоставление второго аргумента предотвращает условное исключение.

Ответ 2

Существует также:

try:
    del mydict[key]
except KeyError:
    pass

Это только 1 поиск вместо 2. Однако предложения except являются дорогостоящими, поэтому, если вы часто нажимаете предложение except, это, вероятно, будет менее эффективным, чем то, что у вас уже есть.

Ответ 3

Подход: вычислять ключи для удаления, мутировать dict

Позвоните keys список/итератор ключей, которые вы хотите удалить. Я бы сделал это:

keys_to_remove = set(keys).intersection(set(mydict.keys()))
for key in keys_to_remove:
    del mydict[key]

Вы вычисляете перед всеми затронутыми предметами и работаете с ними.

Подход: вычисляйте ключи, чтобы сохранить, введите новый dict с этими клавишами

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

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: v for k, v in mydict.iteritems() if k in keys_to_keep}

или

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: mydict[k] for k in keys_to_keep}