Qual é a melhor maneira de remover um item de um dicionário por valor, isto é, quando a chave do item's é desconhecida? Aqui's é uma abordagem simples:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Haverá melhores formas? Há algo de errado com a mutação (eliminação de itens) do dicionário enquanto se faz iteração?
Esteja ciente de que'está actualmente a testar a identidade do objecto (é
apenas devolve Verdade
se ambos os operandos forem representados pelo mesmo objecto na memória - este nem sempre é o caso com dois objectos que se comparam iguais com ==
). Se estiver a fazer isto de propósito, então poderá reescrever o seu código como
some_dict = {key: value for key, value in some_dict.items()
if value is not value_to_remove}
Mas isto pode não fazer o que se quer:
>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}
Por isso, provavelmente quer !=
em vez de não é
.
items()
devolve uma lista, e é essa lista que está a iterar, por isso, mutar o ditado no laço não'aqui não importa. Se estivesse a utilizar iteritems()
em vez disso, a mutação da ditadura no laço seria problemática, e da mesma forma para viewitems()
em Python 2.7.
Posso'não consigo pensar numa maneira melhor de remover itens de um ditado por valor.
Não há nada de errado em apagar itens do dicionário enquanto se faz iteração, como você've propôs. Tenha cuidado com vários tópicos usando o mesmo dicionário ao mesmo tempo, o que pode resultar num KeyError ou outros problemas.
É claro, ver os documentos em http://docs.python.org/library/stdtypes.html#typesmapping