Respostas:
Para excluir uma chave, independentemente de ela estar no dicionário, use o formato de dois argumentos dict.pop()
:
my_dict.pop('key', None)
Isso retornará my_dict[key]
se key
existir no dicionário e None
caso contrário. Se o segundo parâmetro não for especificado (ou seja my_dict.pop('key')
) e key
não existir, a KeyError
será gerado.
Para excluir uma chave com garantia de existência, você também pode usar
del my_dict['key']
Isso aumentará a KeyError
se a chave não estiver no dicionário.
pop()
excessivo del
: 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?"
if 'key' in my_dict: del my_dict['key']
... bem, você perguntou ;-)
Você deve considerar, no entanto, que essa maneira de excluir um objeto de a nãodict
é atômica - é possível que 'key'
possa estar presente my_dict
durante a if
instrução, mas pode ser excluída antes da del
execução, caso em que del
falhará com a KeyError
. Diante disso, seria mais seguro usardict.pop
ou algo do tipo:
try:
del my_dict['key']
except KeyError:
pass
o que, é claro, definitivamente não é uma linha.
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, mas try
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:
pop(key[, default])
Se a chave estiver no dicionário, remova-a e retorne seu valor; caso contrário, retorne o padrão . Se o padrão não for fornecido e a chave não estiver no dicionário, a
KeyError
será gerado.
dict.pop?
no IPython.
del my_dict[key]
é um pouco mais rápido do que my_dict.pop(key)
para remover uma chave de um dicionário quando a chave existe
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
Mas quando a chave não existe, if key in my_dict: del my_dict[key]
é um pouco mais rápido que my_dict.pop(key, None)
. Ambos são pelo menos três vezes mais rápidos do que del
em uma declaração try
/ except
:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
pop
para a del
. A criação do dicionário anula completamente as coisas dele.
del
e pop
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:
myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}
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:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}
ou python3
, você deve usar uma compreensão da lista:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]
Funciona. E 'e' não causou um erro, mesmo que o myDict não tenha uma chave 'e'.
map
amigos agora são preguiçosos e retornam iteradores. Usar map
efeitos colaterais geralmente é considerado uma má prática; um for ... 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 a map
(e filter
).
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 exemplo loop(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:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
Você pode excluir por condições. Nenhum erro se key
não existir.
Usando a palavra-chave "del":
del dict[key]
Podemos excluir uma chave de um dicionário Python pelas seguintes abordagens.
Usando a del
palavra - chave; é quase a mesma abordagem que você fez -
myDict = {'one': 100, 'two': 200, 'three': 300 }
print(myDict) # {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : del myDict['one']
print(myDict) # {'two': 200, 'three': 300}
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
.
myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}
Se o rodarmos no shell, ele executará algo como {'five': 500, 'four': 400, 'three': 300, 'two': 200}
- observe que não é o mesmo pedido que myDict
. Novamente, se tentarmos imprimir myDict
, 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:
var = {key:value for key, value in myDict.items() if key != 'one'}
Agora, se tentarmos imprimi-lo, seguirá a ordem dos pais:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}
Ou
Usando o pop()
método
myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)
if myDict.get('one') : myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
A diferença entre del
e pop
é que, usando o pop()
método, podemos realmente armazenar o valor da chave, se necessário, como o seguinte:
myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var) # 100
Bifurque esta essência para referência futura, se você achar isso útil.
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:
try:
del dict[key]
except KeyError: pass
Isso é mais lento, porém, que o pop()
método, se a chave não existir.
my_dict.pop('key', None)
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:
if 'key' in dict:
del myDict['key']
Mas esse método é perigoso porque se 'key'
for removido entre as duas linhas, a KeyError
será gerado.
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.
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
Resultado:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
isso mudará
my_dict
de lugar (mutável)
my_dict.pop('key', None)
gerar um novo ditado (imutável)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)