Qual é o dict.get()
método?
Como já mencionado, o get
método contém um parâmetro adicional que indica o valor ausente. A partir da documentação
get(key[, default])
Retorne o valor para key se key estiver no dicionário, caso contrário, será o padrão. Se o padrão não for fornecido, o padrão será Nenhum, para que esse método nunca apresente a KeyError
.
Um exemplo pode ser
>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1
Existem melhorias de velocidade em algum lugar?
Como mencionado aqui ,
Parece que todas as três abordagens agora exibem desempenho semelhante (cerca de 10% uma da outra), mais ou menos independentes das propriedades da lista de palavras.
No início, get
era consideravelmente mais lento. No entanto, agora a velocidade é quase comparável, além da vantagem adicional de retornar o valor padrão. Mas, para limpar todas as nossas consultas, podemos testar em uma lista bastante grande (observe que o teste inclui procurar apenas todas as chaves válidas)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Agora cronometrando essas duas funções usando timeit
>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979
Como podemos ver, a pesquisa é mais rápida que a get, pois não há pesquisa de função. Isso pode ser visto atravésdis
>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE
Onde isso será útil?
Será útil sempre que você desejar fornecer um valor padrão sempre que estiver pesquisando um dicionário. Isso reduz
if key in dic:
val = dic[key]
else:
val = def_val
Para uma única linha, val = dic.get(key,def_val)
Onde não será útil?
Sempre que você desejar retornar, KeyError
informando que a chave específica não está disponível. Retornar um valor padrão também traz o risco de que um valor padrão específico também seja uma chave!
É possível ter get
um recurso semelhante dict['key']
?
Sim! Precisamos implementar a __missing__
subclasse dict.
Um programa de amostra pode ser
class MyDict(dict):
def __missing__(self, key):
return None
Uma pequena demonstração pode ser
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
edictionary.get("foo")
se comportar de maneira diferente, no entanto.