¿Estás trabajando con Python y necesitas comprobar si un diccionario contiene una determinada clave? Te lo explico en este artículo en el que te doy varias alternativas para que puedas usar la que mejor se adapte a tu contexto, y te muestro algunos ejemplos.
Para saber si una clave está en un diccionario de Python basta con utilizar el operador in
de la siguiente manera. Sea c
la clave a comprobar y d
el diccionario haremos c in d
, que nos devolverá un True
si el diccionario tiene la clave y False
en caso contrario.
Como ves, es directo y sencillo, al más puro estilo Python. El principal problema con esta cuestión es que muchos buscamos una función o método para hacer la comprobación pero, como siempre, Python nos facilita las cosas y basta con usar in
.
Cómo comprobar si una clave está en un diccionario con in
Ya lo has visto justo al principio de este artículo. Si tenemos un diccionario d
y necesitamos saber si hay algún elemento en d
con la clave c
, basta con preguntar ¿está c
en d
?. Lo podemos hacer de la siguiente manera: c in d
. Esto nos devolverá un valor booleano que se puede utilizar en un condicional para actuar en consecuencia.
Veamos algún ejemplo:
diccionario = {
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
}
clave = 30
if clave in diccionario:
print(f'La clave {clave} está y el valor asociado es {diccionario[clave]}')
else:
print(f'{clave} no está en el diccionario') # en este ejemplo esto no puede suceder
Es fácil de ver que en este ejemplo, la condición del if
se evaluará como True
y se mostrará por pantalla el mensaje correspondiente con el valor asociado a la clave:
La clave 30 está y el valor asociado es 350
Un ejemplo típico de uso es cuando necesitamos añadir un valor a un diccionario con una determinada clave pero antes necesitamos conocer si esa clave existe. Así, insertaremos el valor si no existe y no haremos nada en caso contrario. Para este caso utilizaremos el operador in
anteponiendo not
. Esto nos permite comprobar la no existencia de una clave en un diccionario:
diccionario = {
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
}
clave = 15
if clave not in diccionario: # usamos el operador not in
diccionario[clave] = 150
else:
print(f'La clave {clave} ya se encuentra en el diccionario') # en este ejemplo esto no puede suceder
print(diccionario) # comprobamos que la nueva clave y valor han sido insertados
Al ejecutar el código de arriba habremos conseguido insertar la nueva clave junto con un nuevo valor. Si la clave ya existiera, se mostraría el mensaje correspondiente por pantalla. El resultado de la ejecución del código anterior es:
{10: 100, 20: 300, 30: 350, 40: 475, 50: 525, 15: 150}
Te explico más en profundidad el operador in
así como su negación not in
, y cómo utilizan por debajo la función de doble subrayado __contains__
en otro artículo sobre cómo comprobar la existencia de una cadena de texto dentro de otra en Python.
La función keys()
Si has experimentado con diccionarios en Python sabrás que la clase que los implementa, dict
, tiene un método que nos devuelve una colección con todas las claves de un diccionario: keys()
.
En Python 2, esta función nos devuelve una lista con todas las claves. Realizar una comprobación in
de una clave en una lista es una operación costosa, de complejidad O(n), y no debe realizarse, siendo preferible la opción del apartado anterior.
En Python 3, la función keys()
devuelve un objeto del tipo conjunto en el que las comprobaciones son más livianas, con complejidad O(1), con lo que podría usarse para conocer la existencia de la clave. Por ejemplo, para un diccionario d
y una clave a buscar c
se podría hacer: c in d.keys()
.
De todas formas, esto no tiene ninguna ventaja sobre la opción preferida c in d
, que además resulta más clara y limpia.
El error KeyError y cómo manejarlo
Cuando no comprobamos si una clave determinada se encuentra en un diccionario e intentamos acceder a él por medio de dicha clave, obtenemos uno de los errores más comunes y conocidos en Python: KeyError
.
Vamos a verlo en un ejemplo con su salida por pantalla:
diccionario = {
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
}
print(diccionario[25])
KeyError: 25
Cómo ves, el mensaje de error (además del traceback que he omitido) nos muestra cuál es la clave que genera el error.
Este error puede ser controlado mediante la construcción try
/ except
para actuar en consecuencia. La manera de realizarlo es la siguiente, donde escribimos el código que puede causar el error dentro del bloque try
y el código para gestionar el error dentro del bloque except
.
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.
Recuerda que puedes añadir a try
/ except
un else
si necesitas un código que se ejecute en caso de que no haya error. También, opcionalmente de nuevo, puedes añadir un bloque finally
que siempre se ejecuta, haya error o no.
Vemos un ejemplo:
diccionario = {
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
}
clave = 20
try:
print(f'El valor para {clave} es {diccionario[clave]}') # se ejecutará correctamente
except:
print(f'La clave {clave} no se encuentra en el diccionario')
clave = 25
try:
print(f'El valor para {clave} es {diccionario[clave]}') # esto genera un error KeyError
except:
print(f'La clave {clave} no se encuentra en el diccionario')
El resultado por pantalla será el siguiente:
El valor para 20 es 300 La clave 25 no se encuentra en el diccionario
Cómo comprobar si una clave está en un diccionario con get()
La clase dict
nos proporciona una función get
que recibe una clave y nos devuelve el valor indexado por dicha clave en el diccionario. Para un diccionario d
y una clave c
se utiliza de esta manera: d.get(c)
.
La diferencia respecto del acceso con la notación de corchetes es que, si la clave no existe, no se genera un error KeyError
y se devuelve el valor None
.
Así, aunque la forma más correcta de saber si una clave existe o no es con in
y not in
como ya te he contado, también podemos hacer uso de get
y comprobar si el valor devuelto es None
.
¡Cuidado! Es posible que tengamos un diccionario en el que hayamos guardado algunos valores None
para determinadas claves. De ser así, este método de comprobación no nos serviría.
Veamos un sencillo ejemplo:
diccionario = {
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
}
valor = diccionario.get(30)
if valor is not None: # comprobamos que el valor no es None
print(valor)
else:
print('La clave no existe.')
valor = diccionario.get(35)
if valor is not None:
print(valor)
else:
print('La clave no existe')
Y el resultado por pantalla será el siguiente:
350 La clave no existe
Cómo obtener un valor por defecto si una clave no está en un diccionario
Hay veces en las que necesitamos trabajar con un valor determinado por defecto en caso de que una clave no exista en el diccionario. De esta manera ya no es necesario comprobar si la clave existe o no.
Para estos casos, en lugar de utilizar try
/ execpt
como hemos visto anteriormente, podemos hacer uso, nuevamente, de la función get
de los diccionarios. Esta función admite un segundo parámetro con el valor por defecto a devolver si una clave no existe. Así, en este caso, obtendremos este valor por defecto y no None
.
Lo vemos en otro sencillo ejemplo:
diccionario = {
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
}
clave = 30
valor = diccionario.get(clave, 0) # indicamos el valor por defecto en el segundo parámetro
print(valor)
clave = 35
valor = diccionario.get(clave, 0)
print(valor)
350 0
Fíjate que en el segundo caso, al no existir la clave 35 en diccionario
el valor devuelto por get
es 0, ya que es lo que hemos indicado para el valor por defecto.
Para evitar tener que utilizar un valor por defecto en todas las llamadas a get
, podemos utilizar otra clase de diccionario perteneciente a la librería estándar collections
de Python y que se llama defaultdict
.
Esta clase nos permite definir una factoría de valores por defecto que no es más que una función que nos devuelve un valor que será el usado por defecto en caso de que una clave no exista, siempre y cuando se use la notación de corchetes para acceder a los valores.
Para utilizar este tipo de diccionarios basta con importar primero la clase e indicar la función que hará de factoría de valores por defecto en el constructor. Lo vemos en un ejemplo donde uso una expresión lambda para definir la factoría:
from collections import defaultdict
# creamos el diccionario y definimos la factoría de valores por defecto
# como una función lambda (que siempre devuelve 0)
diccionario = defaultdict(lambda: 0)
diccionario.update({ # añadimos los valores la diccionario
10: 100,
20: 300,
30: 350,
40: 475,
50: 525
})
valor = diccionario[30] # esta clave sí está en el diccionario
print(valor)
valor = diccionario[35] # esta clave no se encuentra en el diccionario
print(valor)
Y el resultado por pantalla será el siguiente:
350 0
Conclusiones
Bueno, hasta aquí la resolución de esta duda frecuente. Espero que con esto tengas perfectamente claro como comprobar la existencia de una clave en un diccionario de Python, sus alternativas y otros conceptos relacionados.
Si crees que esta entrada te ha aportado algo de valor o claridad, o al menos te ha resuelto el problema que tenías, considera el suscribirte a la lista de correo de Código Pitón. Recibirás trucos y consejos de Python en tu email así como un regalito que seguro que te gustará.
¡Y comparte este artículo! 🙂
15 conceptos fundamentales que necesitas conocer para aprender y dominar Python
Te voy a hacer cuatro regalos (no uno, no dos, no tres, cuatro) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python, una cheat sheet de Python en español: La Hoja de Referencia de Python, una guía de ChatGPT y Python y 30 ejercicios de Python (es un reto para ti).
Estos regalos son exclusivos para los suscriptores de Código Pitón.
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales.
Legitimación: tu consentimiento.
Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (GetResponse).
Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control.
Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.