Cual es el dict.get()
metodo
Como ya se mencionó, el get
método contiene un parámetro adicional que indica el valor faltante. De la documentación
get(key[, default])
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, de modo que este método nunca genere a KeyError
.
Un ejemplo puede 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
¿Hay mejoras de velocidad en alguna parte?
Como se menciona aquí ,
Parece que los tres enfoques ahora exhiben un rendimiento similar (dentro de aproximadamente el 10% entre sí), más o menos independientes de las propiedades de la lista de palabras.
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)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Ahora cronometrando estas dos funciones 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, 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 dedis
>>> 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
¿Dónde será útil?
Será útil siempre que desee proporcionar un valor predeterminado cada vez que busque un diccionario. Esto reduce
if key in dic:
val = dic[key]
else:
val = def_val
A una sola línea, val = dic.get(key,def_val)
¿Dónde no será útil?
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!
¿Es posible tener get
como característica en dict['key']
?
¡Si! Necesitamos implementar el __missing__
en una subclase dict.
Un programa de muestra puede ser
class MyDict(dict):
def __missing__(self, key):
return None
Una pequeña demostración puede ser
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
ydictionary.get("foo")
comportarse de manera diferente, sin embargo.