Удалить элемент справочника, если ключ существует [дубликат]


этот вопрос уже есть ответ здесь:

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

if key in mydict:
    del mydict[key]

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

3   170  

3 ответа:

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

 mydict.pop("key", None)

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

также:

try:
    del mydict[key]
except KeyError:
    pass

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

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

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

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

вы рассчитываете заранее все затронутые элементы и работать на них.

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

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

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}