Ao excluir uma chave de um dicionário, eu uso:
if 'key' in my_dict:
del my_dict['key']
Existe uma maneira única de fazer isso?
Ao excluir uma chave de um dicionário, eu uso:
if 'key' in my_dict:
del my_dict['key']
Existe uma maneira única de fazer isso?
Respostas:
Para excluir uma chave, independentemente de ela estar no dicionário, use o formato de dois argumentos
dict.pop()
:Isso retornará
my_dict[key]
sekey
existir no dicionário eNone
caso contrário. Se o segundo parâmetro não for especificado (ou sejamy_dict.pop('key')
) ekey
não existir, aKeyError
será gerado.Para excluir uma chave com garantia de existência, você também pode usar
Isso aumentará a
KeyError
se a chave não estiver no dicionário.fonte
pop()
excessivodel
: retorna o valor para essa chave. Dessa forma, você pode obter e excluir uma entrada de um ditado em uma linha de código.try
/except
se a chave não existir. Você pode achar um ou outro mais fácil de ler, o que é bom. Ambos são Python idiomáticos, então escolha o que preferir. Mas afirmar que essa resposta é mais complexa ou ineficiente simplesmente não faz sentido.self
, portanto, seria bastante surpreendente se esse acontecesse.Especificamente para responder "existe uma maneira única de fazer isso?"
... bem, você perguntou ;-)
Você deve considerar, no entanto, que essa maneira de excluir um objeto de a não
dict
é atômica - é possível que'key'
possa estar presentemy_dict
durante aif
instrução, mas pode ser excluída antes dadel
execução, caso em quedel
falhará com aKeyError
. Diante disso, seria mais seguro usardict.pop
ou algo do tipo:o que, é claro, definitivamente não é uma linha.
fonte
pop
é definitivamente mais conciso, embora exista uma vantagem importante de fazê-lo desta maneira: fica imediatamente claro o que está fazendo.try/except
afirmação é mais cara. Gerar uma exceção é lento.try
é marginalmente mais rápida, embora, se não existir,try
é realmente muito mais lenta.pop
é razoavelmente consistente, mas mais lento que tudo, mastry
com uma chave não presente. Consulte gist.github.com/zigg/6280653 . Em última análise, depende de quantas vezes você espera que a chave para realmente estar no dicionário, e se ou não você precisa atomicity-e, é claro, se você está ou não se envolver em otimização prematura;)if 'key' in mydict: #then del...
. Eu precisava retirar uma chave / val de um ditado para analisar corretamente, o pop não era uma solução perfeita.Levei algum tempo para descobrir o que exatamente
my_dict.pop("key", None)
está fazendo. Então, adicionarei isso como resposta para economizar tempo no Google:Documentação
fonte
dict.pop?
no IPython.del my_dict[key]
é um pouco mais rápido do quemy_dict.pop(key)
para remover uma chave de um dicionário quando a chave existeMas quando a chave não existe,
if key in my_dict: del my_dict[key]
é um pouco mais rápido quemy_dict.pop(key, None)
. Ambos são pelo menos três vezes mais rápidos do quedel
em uma declaraçãotry
/except
:fonte
pop
para adel
. A criação do dicionário anula completamente as coisas dele.del
epop
desde o primeiro conjunto de horários acima)Se você precisar remover muitas chaves de um dicionário em uma linha de código, acho que usar map () é bastante sucinto e legível por Python:
E se você precisar capturar erros nos quais você insere um valor que não está no dicionário, use lambda dentro de map () assim:
ou
python3
, você deve usar uma compreensão da lista:Funciona. E 'e' não causou um erro, mesmo que o myDict não tenha uma chave 'e'.
fonte
map
amigos agora são preguiçosos e retornam iteradores. Usarmap
efeitos colaterais geralmente é considerado uma má prática; umfor ... in
loop padrão seria melhor. Consulte Exibições e iteradores em vez de listas para obter mais informações.[myDict.pop(i, None) for i in ['a', 'c']]
, pois oferece uma alternativa geral amap
(efilter
).for ... in
loop regular .map()
, que costuma ser usado por seus efeitos colaterais. A alternativa recomendada no Python é a compreensão da lista, que, na minha opinião, ainda é bastante legível e cognitivamente leve como uma linha (veja a pergunta). Utilizadas apenas pelos efeitos colaterais, ambas as construções resultam em uma lista inútil, que pode ser ineficiente. No Python3, não conheço uma função interna que possa iterar com segurança e elegância através de uma expressão de gerador, sem um subproduto caro, por exemploloop(d.pop(k) for k in ['a', 'b'])
.Você pode usar uma compreensão de dicionário para criar um novo dicionário com essa chave removida:
Você pode excluir por condições. Nenhum erro se
key
não existir.fonte
Usando a palavra-chave "del":
fonte
Podemos excluir uma chave de um dicionário Python pelas seguintes abordagens.
Usando a
del
palavra - chave; é quase a mesma abordagem que você fez -Ou
Podemos fazer o seguinte:
Mas é preciso ter em mente que, nesse processo, na verdade, ele não excluirá nenhuma chave do dicionário, em vez de excluir a chave específica desse dicionário. Além disso, observei que ele retornava um dicionário que não tinha o mesmo pedido de
myDict
.Se o rodarmos no shell, ele executará algo como
{'five': 500, 'four': 400, 'three': 300, 'two': 200}
- observe que não é o mesmo pedido quemyDict
. Novamente, se tentarmos imprimirmyDict
, podemos ver todas as chaves, incluindo as que foram excluídas do dicionário por essa abordagem. No entanto, podemos criar um novo dicionário atribuindo a seguinte instrução a uma variável:Agora, se tentarmos imprimi-lo, seguirá a ordem dos pais:
Ou
Usando o
pop()
métodoA diferença entre
del
epop
é que, usando opop()
método, podemos realmente armazenar o valor da chave, se necessário, como o seguinte:Bifurque esta essência para referência futura, se você achar isso útil.
fonte
if myDict.get('one')
para verificar se uma chave está presente! Falha se myDict ['one'] tiver um valor de falsey. Além disso, os ditados não têm uma ordem inerente, portanto, não faz sentido mencioná-la.Você pode usar o tratamento de exceções se quiser ser muito detalhado:
Isso é mais lento, porém, que o
pop()
método, se a chave não existir.Não importa para algumas chaves, mas se você estiver fazendo isso repetidamente, o último método será uma aposta melhor.
A abordagem mais rápida é a seguinte:
Mas esse método é perigoso porque se
'key'
for removido entre as duas linhas, aKeyError
será gerado.fonte
Eu prefiro a versão imutável
fonte
Outra maneira é usar a compreensão de itens () + dict
items () juntamente com a compreensão de ditado também pode nos ajudar a realizar a tarefa de exclusão do par de valores-chave, mas tem a desvantagem de não ser uma técnica de ditado local. Na verdade, um novo ditado se criado, exceto a chave que não queremos incluir.
Resultado:
fonte
Filtro único na chave
Vários filtros nas teclas
fonte