transformar - usando dict python




Verificar se uma determinada chave já existe em um dicionário (13)

Apenas um FYI adicionando a Chris. B (melhor resposta):

d = defaultdict(int)

Funciona também; a razão é que chamar int() retorna 0 que é o que o defaultdict faz nos bastidores (ao construir um dicionário), daí o nome "Factory Function" na documentação.

Eu queria testar se existe uma chave em um dicionário antes de atualizar o valor da chave. Eu escrevi o seguinte código:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Eu acho que essa não é a melhor maneira de realizar essa tarefa. Existe uma maneira melhor de testar uma chave no dicionário?


Bem ... Você vai estar familiarizado que pesquisar a existência de um elemento em uma lista ou dados significa passar por tudo (pelo menos para lista não ordenada, por exemplo, dict.keys) .Então, usando exceções e erros que surgem normalmente, podemos evitar essa complexidade ...

d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")

Eu uso o try / exceto ; Se uma exceção for lançada, a chave não estará presente no dicionário. exemplo:

st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'

O dicionário Python possui o método chamado __contains__ . Este método retornará True se o dicionário tiver a chave else retornando False.

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

O mais fácil é se você souber qual chave (nome da chave) deve procurar:

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

ou você também pode fazer simplesmente como:

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something

Para informações adicionais sobre a velocidade de execução dos métodos propostos da resposta aceita (loops de 10m):

  • 'key' in mydict tempo decorrido 1.07 seg
  • mydict.get('key') tempo decorrido 1.84 sec
  • mydefaultdict['key'] tempo decorrido 1.07 seg

Portanto, usar in ou defaultdict é recomendado contra get .


Por que não apenas usar o método has_key ().

a = {}
a.has_key('b') => #False

a['b'] = 8
a.has_key('b') => #True


Você não precisa ligar para as chaves:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Isso será muito faster , pois usa o hashing do dicionário, em vez de fazer uma pesquisa linear, que as teclas de chamada fazem.


Você pode encurtar isso:

if 'key1' in dict:
    ...

No entanto, isso é, na melhor das hipóteses, uma melhoria cosmética. Por que você acredita que este não é o melhor caminho?


in é a maneira pretendida para testar a existência de uma chave em um dict .

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Se você quisesse um padrão, você sempre pode usar o dict.get() :

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... e se você quisesse sempre garantir um valor padrão para qualquer chave, você pode usar defaultdict do módulo de collections , da seguinte forma:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... mas, em geral, a palavra-chave in é a melhor maneira de fazer isso.


print dict.get('key1', 'blah')

Não imprime boo para os valores no dict, mas realiza o objetivo imprimindo o valor de key1 para confirmar sua existência.


Você pode usar o método has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

Ou o método dict.get para definir um valor padrão se não for encontrado:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0




dictionary