Hoy, me encontré con el dictmétodo getque, 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 Noneasí que maneja implícitamente la excepción KeyErrordictionary['non-existent key'] or Nonedebería y aún plantea un problemaKeyErrorpara 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_valueesNonetal quevuelve
Nonecomoharí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 clavedictionaryydictionary.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_defaultse evaluaríamy_defaultmientrasdictionary.get("bogus", my_default)que devolvería el valor de Falsey. Entonces no,dictionary.get("bogus") or my_defaultno es equivalente adictionary.get("bogus", my_default). Cuál usar depende del comportamiento que desee.x = {'a':0}. Luegox.get('a', 'foo')vuelve0perox.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
getmétodo contiene un parámetro adicional que indica el valor faltante. De la documentaciónUn ejemplo puede ser
Como se menciona aquí ,
Anteriormente
getera 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
timeitComo 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
disSerá ú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
KeyErrorindique 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()gettoma un segundo valor opcional. Si la clave especificada no existe en su diccionario, se devolverá este valor.Si no proporciona el segundo parámetro,
Nonese 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áNoneincluso 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 serNone0. Resumen
En comparación con
dict[key],dict.getproporciona 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.getintroduce un valor predeterminado opcional que evita los códigos anteriores de manera involuntaria.3. Conclusión
dict.gettiene 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
getmétodo.Ejemplo 1
Ejemplo2
fuente