Qual é a melhor maneira de remover um item de um dicionário por valor, ou seja, quando a chave do item é desconhecida? Esta é uma abordagem simples:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Existem maneiras melhores? Há algo de errado em alterar (excluir itens) do dicionário durante a iteração?
python
dictionary
Buttons840
fonte
fonte
Respostas:
Esteja ciente de que você está testando atualmente a identidade do objeto (
is
retorna apenasTrue
se os dois operandos forem representados pelo mesmo objeto na memória - nem sempre é o caso com dois objetos que são comparados iguais a==
). Se você estiver fazendo isso de propósito, poderá reescrever seu código comoMas isso pode não fazer o que você deseja:
Então você provavelmente quer em
!=
vez deis not
.fonte
some_dict.iteritems()
aqui e colocar as instruçõesfor
eif
em linhas separadas paraiteritems
agora estouitems
. No Python 2.7,iteritems()
é realmente melhor.dict()
com uma expressão geradora apropriada, que é 2.4. meta: pode navegar pelos peps aqui para descobrir coisas.O
dict.pop(key[, default])
método permite remover itens quando você conhece a chave. Ele retorna o valor na chave se remover o item, caso contrário, retorna o que foi passado comodefault
. Veja a documentação . 'Exemplo:
fonte
fonte
Uma comparação simples entre del e pop () :
resultado:
Portanto, del é mais rápido que pop () .
fonte
pop()
(como @ n-1-1 acima) - que não é uma opção para odel
operador.timeit
. Obrigado por este exemplo claro.items()
retorna uma lista, e é essa lista que você está iterando, portanto, alterar o dict no loop não importa aqui. Se você estivesse usando emiteritems()
vez disso, alterar o dict no loop seria problemático , e da mesma forma paraviewitems()
no Python 2.7.Não consigo pensar em uma maneira melhor de remover itens de um dicionário por valor.
fonte
Eu construiria uma lista de chaves que precisam ser removidas e, em seguida, removeria. É simples, eficiente e evita qualquer problema de iteração simultânea e mutação do dict.
fonte
c é o novo dicionário e a é seu dicionário original, {'z', 'w'} são as chaves que você deseja remover de um
Verifique também: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
fonte
fonte
Não há nada de errado em excluir itens do dicionário durante a iteração, como você propôs. Tenha cuidado com vários threads usando o mesmo dicionário ao mesmo tempo, o que pode resultar em um KeyError ou outros problemas.
Claro, consulte os documentos em http://docs.python.org/library/stdtypes.html#typesmapping
fonte
for k,v in d.iteritems(): del d[k]
dariaRuntimeError: dictionary changed size during iteration
. Veja a explicação de mithrandi.É assim que eu faria.
fonte