Hoje, me deparei com o dict
método get
que, dado uma chave no dicionário, retorna o valor associado.
Para que finalidade essa função é útil? Se eu quisesse encontrar um valor associado a uma chave em um dicionário, posso simplesmente fazê dict[key]
-lo, e ele retornará a mesma coisa:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
fonte
fonte
dictionary["foo"]
edictionary.get("foo")
se comportar de maneira diferente, no entanto.dictionary.get("Age")
é o mesmo que escreverdictionary["Age"] or None
para que ele lida com implicitamente KeyError exceçãodictionary['non-existent key'] or None
deveria e ainda aumenta umKeyError
para mim (até a v3.6). Pode explicar o que quer dizer?Respostas:
Permite fornecer um valor padrão se a chave estiver ausente:
retorna
default_value
(o que você escolher), enquantoaumentaria a
KeyError
.Se omitido,
default_value
éNone
, tal queretorna
None
comoseria.
fonte
dictionary.get("bogus") or my_default
? Eu já vi pessoas usá-lo em alguns casos e fiquei imaginando se há alguma vantagem em usar um em vez do outro (além da legibilidade)."bogus"
é uma chave emdictionary
edictionary.get("bogus")
retorna um valor que avalia a Falso em um contexto booleano (isto é, um valor Falsey), tal como 0 ou uma cadeia vazia,''
, em seguida,dictionary.get("bogus") or my_default
iria avaliar amy_default
Considerando quedictionary.get("bogus", my_default)
iria retornar o valor Falsey. Então não,dictionary.get("bogus") or my_default
não é equivalente adictionary.get("bogus", my_default)
. Qual usar depende do comportamento que você deseja.x = {'a':0}
. Entãox.get('a', 'foo')
retorna,0
masx.get('a') or 'foo'
retorna'foo'
.dictionary.get('key')
: Pode ser confuso se os valores no dicionário foremNone
. Sem especificar o valor de retorno (segundo argumento opcional), não há como verificar se a chave não existia ou se seu valor éNone
. Nesse caso específico, eu consideraria usartry-except-KeyError
.Como já mencionado, o
get
método contém um parâmetro adicional que indica o valor ausente. A partir da documentaçãoUm exemplo pode ser
Como mencionado aqui ,
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)Agora cronometrando essas duas funções usando
timeit
Como podemos ver, a pesquisa é mais rápida que a get, pois não há pesquisa de função. Isso pode ser visto através
dis
Será útil sempre que você desejar fornecer um valor padrão sempre que estiver pesquisando um dicionário. Isso reduz
Para uma única linha,
val = dic.get(key,def_val)
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!Sim! Precisamos implementar a
__missing__
subclasse dict.Um programa de amostra pode ser
Uma pequena demonstração pode ser
fonte
if k in dict and dict[k]:
vsif dict.get(k):
. Este abrange a situação quando precisamos verificar se existe chave, e se 'sim' - o valor ?, algo como:dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
se poderia considerar o usodictionary.get(value) or long_function()
get
leva um segundo valor opcional. Se a chave especificada não existir no seu dicionário, esse valor será retornado.Se você não der o segundo parâmetro,
None
será retornado.Se você usar a indexação como em
dictionary['Year']
, as chaves inexistentes aumentarãoKeyError
.fonte
Vou dar um exemplo prático na raspagem de dados da Web usando python, muitas vezes você obterá chaves sem valores; nesses casos, ocorrerá erros se você usar o dicionário ['key'], enquanto o dictionary.get ('key ',' return_otherwise ') não tem problemas.
Da mesma forma, eu usaria '' .join (list) em oposição à list [0] se você tentar capturar um único valor de uma lista.
espero que ajude.
[Editar] Aqui está um exemplo prático:
Digamos que você esteja chamando uma API, que retorna um arquivo JOSN que você precisa analisar. O primeiro JSON se parece com o seguinte:
O segundo JOSN é assim:
Observe que o segundo JSON está ausente na chave "submitdate_ts", o que é bastante normal em qualquer estrutura de dados.
Portanto, quando você tenta acessar o valor dessa chave em um loop, pode chamá-lo com o seguinte:
Você poderia, mas isso fornecerá um erro de traceback para a segunda linha JSON, porque a chave simplesmente não existe.
A maneira apropriada de codificar isso pode ser a seguinte:
{'x': None} existe para evitar que o segundo nível obtenha um erro. É claro que você pode criar mais tolerância a falhas no código se estiver fazendo raspagem. Como primeiro especificando uma condição if
fonte
O objetivo é fornecer um valor padrão se a chave não for encontrada, o que é muito útil
fonte
Um uso específico é contar com um dicionário. Vamos supor que você queira contar o número de ocorrências de cada elemento em uma determinada lista. A maneira comum de fazer isso é criar um dicionário em que as chaves sejam elementos e os valores sejam o número de ocorrências.
Usando o
.get()
método, você pode tornar esse código mais compacto e claro:fonte
Uma dica para estar ciente ao usar
.get()
:Se o dicionário contiver a chave usada na chamada
.get()
e seu valor forNone
, o.get()
método retornaráNone
mesmo que um valor padrão seja fornecido.Por exemplo, o seguinte retorna
None
, não'alt_value'
como o esperado:.get()
O segundo valor de apenas será retornado se a chave fornecida NÃO estiver no dicionário, e não se o valor de retorno dessa chamada forNone
.fonte
d.get('key') or 'alt_value'
, se você sabe que poderia serNone
0. Resumo
Comparando com
dict[key]
,dict.get
fornece um valor de fallback ao procurar uma chave.1. Definição
get (key [, padrão]) 4. Tipos internos - documentação do Python 3.6.4rc1
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 gere um KeyError.
2. Problema que resolve.
Caso contrário
default value
, você deve escrever códigos pesados para lidar com essa exceção.Como uma solução conveniente,
dict.get
introduz um valor padrão opcional, evitando códigos acima de forma não intencional.3. Conclusão
dict.get
possui uma opção de valor padrão adicional para lidar com a exceção se a chave estiver ausente no dicionáriofonte
Uma diferença, que pode ser uma vantagem, é que, se estivermos procurando por uma chave que não existe, obteremos None, não como quando usamos a notação de colchetes; nesse caso, receberemos um erro:
A última coisa interessante sobre o método get é que ele recebe um argumento opcional adicional para um valor padrão, ou seja, se tentamos obter o valor da pontuação de um aluno, mas o aluno não tem uma chave de pontuação que podemos obter um 0 em vez disso.
Então, ao invés de fazer isso (ou algo semelhante):
Nós podemos fazer isso:
fonte
Com base no uso deve usar este
get
método.Exemplo 1
Exemplo2
fonte