Hoy, me encontré con el dict
método get
que, dada una clave en el diccionario, devuelve el valor asociado.
¿Para qué sirve esta función? Si quisiera encontrar un valor asociado con una clave en un diccionario, simplemente puedo hacerlo dict[key]
, y devuelve lo mismo:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
fuente
fuente
dictionary["foo"]
ydictionary.get("foo")
comportarse de manera diferente, sin embargo.dictionary.get("Age")
es lo mismo que escribir,dictionary["Age"] or None
así que maneja implícitamente la excepción KeyErrordictionary['non-existent key'] or None
debería y aún plantea un problemaKeyError
para mí (hasta v3.6). ¿Puedes explicar a qué te refieres?Respuestas:
Le permite proporcionar un valor predeterminado si falta la clave:
devuelve
default_value
(lo que sea que elija), mientras queelevaría a
KeyError
.Si se omite,
default_value
esNone
tal quevuelve
None
comoharía.
fuente
dictionary.get("bogus") or my_default
? He visto a personas usarlo en algunos casos y me preguntaba si hay alguna ventaja de usar uno en lugar del otro (aparte de la legibilidad)"bogus"
es una clavedictionary
ydictionary.get("bogus")
devuelve un valor que se evalúa como Falso en un contexto booleano (es decir, un valor de Falsey), como 0 o una cadena vacía''
, entoncesdictionary.get("bogus") or my_default
se evaluaríamy_default
mientrasdictionary.get("bogus", my_default)
que devolvería el valor de Falsey. Entonces no,dictionary.get("bogus") or my_default
no es equivalente adictionary.get("bogus", my_default)
. Cuál usar depende del comportamiento que desee.x = {'a':0}
. Luegox.get('a', 'foo')
vuelve0
perox.get('a') or 'foo'
vuelve'foo'
.dictionary.get('key')
: puede ser confuso si los valores en el diccionario sonNone
. Sin especificar el valor de retorno (segundo argumento opcional) no hay forma de verificar si la clave no existía o si su valor esNone
. En este caso específico, consideraría usartry-except-KeyError
.Como ya se mencionó, el
get
método contiene un parámetro adicional que indica el valor faltante. De la documentaciónUn ejemplo puede ser
Como se menciona aquí ,
Anteriormente
get
era considerablemente más lento, sin embargo, ahora la velocidad es casi comparable junto con la ventaja adicional de devolver el valor predeterminado. Pero para borrar todas nuestras consultas, podemos probar en una lista bastante grande (tenga en cuenta que la prueba incluye buscar solo todas las claves válidas)Ahora cronometrando estas dos funciones usando
timeit
Como podemos ver, la búsqueda es más rápida que la obtención, ya que no hay búsqueda de funciones. Esto se puede ver a través de
dis
Será útil siempre que desee proporcionar un valor predeterminado cada vez que busque un diccionario. Esto reduce
A una sola línea,
val = dic.get(key,def_val)
Siempre que desee devolver un mensaje que
KeyError
indique que la clave particular no está disponible. ¡Devolver un valor predeterminado también conlleva el riesgo de que un valor predeterminado particular también sea una clave!¡Si! Necesitamos implementar el
__missing__
en una subclase dict.Un programa de muestra puede ser
Una pequeña demostración puede ser
fuente
if k in dict and dict[k]:
vsif dict.get(k):
. Esto cubre la situación en la que tenemos que comprobar si la clave existe, y si 'sí' - ¿qué valor ?, algo como:dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
uno podría considerar usarlodictionary.get(value) or long_function()
get
toma un segundo valor opcional. Si la clave especificada no existe en su diccionario, se devolverá este valor.Si no proporciona el segundo parámetro,
None
se devolverá.Si usa la indexación como en
dictionary['Year']
, las teclas inexistentes apareceránKeyError
.fuente
Daré un ejemplo práctico en el raspado de datos web usando python, muchas veces obtendrás claves sin valores, en esos casos obtendrás errores si usas dictionary ['key'], mientras dictionary.get ('key ',' return_otherwise ') no tiene problemas.
Del mismo modo, usaría '' .join (list) en lugar de list [0] si intenta capturar un solo valor de una lista.
Espero eso ayude.
[Editar] Aquí hay un ejemplo práctico:
Digamos que está llamando a una API, que devuelve un archivo JOSN que necesita analizar. El primer JSON tiene el siguiente aspecto:
El segundo JOSN es así:
Tenga en cuenta que al segundo JSON le falta la clave "submitdate_ts", que es bastante normal en cualquier estructura de datos.
Entonces, cuando intentas acceder al valor de esa clave en un bucle, ¿puedes llamarlo con lo siguiente?
Podría, pero le dará un error de rastreo para la segunda línea JSON, porque la clave simplemente no existe.
La forma apropiada de codificar esto podría ser la siguiente:
{'x': Ninguno} está ahí para evitar que el segundo nivel obtenga un error. Por supuesto, puede incorporar más tolerancia a fallas en el código si está haciendo scraping. Como primero especificando una condición if
fuente
El propósito es que puede dar un valor predeterminado si no se encuentra la clave, lo cual es muy útil
fuente
Un uso particular es contar con un diccionario. Supongamos que desea contar el número de ocurrencias de cada elemento en una lista dada. La forma común de hacerlo es hacer un diccionario donde las claves son elementos y los valores son el número de ocurrencias.
Usando el
.get()
método, puede hacer que este código sea más compacto y claro:fuente
Hay que tener en cuenta al usar
.get()
:Si el diccionario contiene la clave utilizada en la llamada a
.get()
y su valor esNone
, el.get()
método devolveráNone
incluso si se proporciona un valor predeterminado.Por ejemplo, los siguientes retornos
None
, no'alt_value'
como se puede esperar:.get()
El segundo valor solo se devuelve si la clave suministrada NO está en el diccionario, no si el valor devuelto de esa llamada sí lo estáNone
.fuente
d.get('key') or 'alt_value'
si sabe que podría serNone
0. Resumen
En comparación con
dict[key]
,dict.get
proporciona un valor de reserva al buscar una clave.1. Definición
get (clave [, predeterminado]) 4. Tipos incorporados: documentación de Python 3.6.4rc1
Devuelve el valor de la clave si la clave está en el diccionario; de lo contrario, es el valor predeterminado. Si no se proporciona el valor predeterminado, el valor predeterminado es Ninguno, por lo que este método nunca genera un KeyError.
2. Problema que resuelve.
Si no es así
default value
, debe escribir códigos engorrosos para manejar dicha excepción.Como una solución conveniente,
dict.get
introduce un valor predeterminado opcional que evita los códigos anteriores de manera involuntaria.3. Conclusión
dict.get
tiene una opción de valor predeterminado adicional para tratar la excepción si la clave está ausente del diccionariofuente
Una diferencia, que puede ser una ventaja, es que si buscamos una clave que no existe, obtendremos None, no como cuando usamos la notación de corchetes, en cuyo caso obtendremos un error:
Lo último que tiene de bueno el método get es que recibe un argumento opcional adicional para un valor predeterminado, es decir, si tratamos de obtener el valor de puntaje de un estudiante, pero el estudiante no tiene una clave de puntaje que podamos obtener un 0 en su lugar.
Entonces, en lugar de hacer esto (o algo similar):
Podemos hacer esto:
fuente
Basado en el uso debe utilizar este
get
método.Ejemplo 1
Ejemplo2
fuente