Saltar al contenido

Cómo Saber si una Clave está en un Diccionario en Python

Cómo comprobar si una clave existe en un diccionario de Python

¿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().

15 conceptos fundamentales que necesitas conocer para aprender y dominar Python

Te voy a hacer dos regalos (no uno, sino dos) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python y una cheat sheet de Python en español: La Hoja de Referencia de Python.

Estos regalos son exclusivos para los suscriptores de Código Pitón.

👍 Quiero suscribirme y mis dos regalos

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.

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.

Recibe contenido exclusivo y obtén gratis la Hoja de Referencia de Python.

Antes de suscribirte consulta aquí la 
Información Básica sobre Protección de Datos. Responsable de datos: Laura Otero Moreira. 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 (MailRelay). 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.

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 le 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! 🙂

 🎁 Tutorial Básico Interactivo y La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
¿Quieres mejorar tu Python? Recibe totalmente gratis el Tutorial Básico Interactivo de Python, la Hoja de Referencia de Python y contenido exclusivo como trucos y consejos.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Laura Otero Moreira. Finalidad de la recogida y tratamiento de los 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 (MailRelay). 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 en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.