2013-03-14 5 views
147

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

if key in mydict: 
    del mydict[key] 

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

+3

@ user1929959 Нет, этот вопрос хочет получить копию словаря, и не имеет значения, что ключ не находится во входном файле. – phihag

ответ

319

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

mydict.pop("key", None) 

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

+9

Для справки, второй аргумент '.pop()' - это то, что он возвращает, если ключ не найден. – OregonTrail

+0

Имейте в виду, что это приведет к удалению ключа из dict. 'mydict.get (« ключ »,« Нет ») является той же опцией. –

+1

@AmitK. да, он удаляет ключ из словаря, что именно то, что задают – guival

7

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

try: 
    del mydict[key] 
except KeyError: 
    pass 

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

+0

это мой страх. Я не был уверен в стоимости двух запросов на удаление по сравнению с использованием try-except. –

+3

@SimonHughes - см. [Этот ответ] (http://programmers.stackexchange.com/questions/175655/python-forgiveness-vs-permission-and-duck-typing/175663#175663) для программистов ... – mgilson

+1

Это называется [eaiser просить прощения, чем разрешение] (https://docs.python.org/3/glossary.html#term-eafp) (EAFP). Стиль Python. – akki

4

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

Давайте назовем 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} 
Смежные вопросы