Dado um dicionário, como posso descobrir se uma determinada chave nesse dicionário já foi definida como um valor diferente de Nenhum?
Ou seja, eu quero fazer isso:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
Ou seja, eu quero incrementar o valor se já houver um lá ou configurá-lo para 1 caso contrário.
python
dictionary
Ben
fonte
fonte
Respostas:
Você está procurando
collections.defaultdict
(disponível para Python 2.5+). estefará o que você quiser.
Para Python regulares
dict
, se não houver valor para uma determinada chave, você não obteráNone
ao acessar o dict - aKeyError
será gerado. Então, se você quiser usar umdict
código regular , em vez do seu código, você usariafonte
dict
s regulares , você pode fazermy_dict[key] = my_dict.get(key, 0) + 1
.Eu prefiro fazer isso em uma linha de código.
Os dicionários têm uma função, get, que aceita dois parâmetros - a chave desejada e um valor padrão, se não existir. Prefiro esse método ao padrão, já que você deseja lidar apenas com o caso em que a chave não existe nessa linha de código, não em todos os lugares.
fonte
Eu pessoalmente gosto de usar
setdefault()
fonte
setdefault
é incrível. Não altera o valor se já estiver definidosome_key
. Por exemplo,d={1:2}; d.setdefault(1, 0)
não perturba o valor ded[1]
.Você precisa do
key in dict
idioma para isso.No entanto, você provavelmente deve considerar o uso
defaultdict
(como sugerido pelo dF).fonte
my_dict[key] is not None
, que é mais clara (IMHO pelo menos)if key in my_dict and my_dict[key]:
Para responder à pergunta " como posso descobrir se um determinado índice nesse ditado já foi definido como um valor diferente de Nenhum ", eu preferiria isso:
Isso está de acordo com o conceito já invocado de EAFP (mais fácil pedir perdão do que permissão). Também evita a pesquisa de chave duplicada no dicionário, como faria em
key in my_dict and my_dict[key] is not None
interessante se a pesquisa fosse cara.Para o problema real que você colocou, por exemplo, incrementar um int, se existir, ou defini-lo com um valor padrão, caso contrário, também recomendo
como na resposta de Andrew Wilkinson.
Existe uma terceira solução se você estiver armazenando objetos modificáveis no seu dicionário. Um exemplo comum disso é um multimap , onde você armazena uma lista de elementos para suas chaves. Nesse caso, você pode usar:
Se um valor para chave não existir no dicionário, o método setdefault o definirá como o segundo parâmetro de setdefault. Ele se comporta exatamente como um padrão my_dict [key], retornando o valor da chave (que pode ser o novo valor definido).
fonte
Concordou com cgoldberg. Como eu faço isso é:
Portanto, faça-o como acima, ou use um ditado padrão, como outros sugeriram. Não use instruções if. Isso não é pitonico.
fonte
+=2
ou-=1
? Você precisa se lembrar de mudar as duas linhas. Pode parecer uma coisa trivial agora, mas esses são os tipos de insetos "triviais" estúpidos que podem voltar a morder você.Como você pode ver nas muitas respostas, existem várias soluções. Uma instância do LBYL (veja antes de saltar) ainda não foi mencionada, o método has_key ():
fonte
A maneira como você está tentando fazer isso é chamada LBYL (veja antes de pular), pois você está verificando as condições antes de tentar aumentar seu valor.
A outra abordagem é chamada EAFP (mais fácil pedir perdão do que permissão). Nesse caso, você apenas tentaria a operação (aumentaria o valor). Se falhar, você capturar a exceção e definir o valor como 1. Essa é uma maneira ligeiramente mais Pythonic de fazer isso (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
fonte
Um pouco tarde, mas isso deve funcionar.
fonte
Isso não está respondendo diretamente à pergunta, mas, para mim, parece que você pode querer a funcionalidade das coleções .
Isso resulta na saída
fonte
defaultdict(int)
com algumas funcionalidades extras, por isso funcionaria perfeitamente ao lidar exclusivamente com números inteiros, mas você não mostra nenhum comportamento relevante.Aqui está uma frase que eu inventei recentemente para resolver esse problema. É baseado no método de dicionário setdefault :
fonte
Eu estava procurando, não encontrei na web, tentei a sorte com Try / Error e encontrei
fonte
__contains__
em um código de produção. btw.__contains__
é o mesmo que usaris
.my_dict.__contains__(some_key)
é equivalente asome_key in my_dict
, é sobrecarga para oin
operador nãois