En este tutorial, aprenderá a utilizar defaultdict del módulo collections de Python -para manejar mejor los KeyErrors- cuando trabaje con diccionarios de Python.
En Python, un diccionario es una potente estructura de datos incorporada que almacena datos en pares clave-valor. Utilizará las claves para acceder al diccionario y acceder a los valores.
Sin embargo, cuando tiene varios diccionarios en su script Python que se modifican durante la ejecución del código, a menudo se encontrará con KeyErrors. Y hay algunas formas diferentes de manejarlos.
En este tutorial, aprenderá
- Qué son los KeyErrors y por qué surgen
- Cómo manejar los KeyErrors
- Cómo utilizar defaultdict de Python, una subclase que hereda de la clase dict incorporada, para manejar mejor las claves perdidas
Comencemos
¿Qué son los KeyErrors en Python?

Al definir un diccionario Python, debe tener cuidado de asegurarse de lo siguiente:
- Las claves deben ser únicas - sin ninguna repetición.
- Cuando utilice un iterable existente como las claves de un diccionario, debería preferir utilizar una colección inmutable como una tupla.
Así, una clave sólo es válida si está presente en el diccionario; de lo contrario, se producen KeyErrors.
Considere el siguiente diccionario, libros_autores
, en el que las claves son los nombres de los libros y los valores son los nombres de los autores.
Puede codificar junto con este tutorial en un REPL de Python.
books_authors = {
'Deep Work':'Cal Newport',
'Hyperfocus':'Chris Bailey',
'Pivot':'Jenny Blake',
'The Happiness Equation':'Neil Pasricha'
}
Puede utilizar la clave (nombre del libro) para acceder al nombre del autor.
books_authors['Hyperfocus']
'Chris Bailey'
Para acceder a todos los pares clave-valor del diccionario, puede llamar al método items()
del objeto diccionario, como se muestra a continuación:
for libro,autor in autores_libros.items():
print(f"'{libro}' de {autor}")
'Deep Work' de Cal Newport
'Hyperfocus' de Chris Bailey
'Pivot' de Jenny Blake
'The Happiness Equation' de Neil Pasricha
Si intenta acceder al valor de una clave que no está presente en el diccionario, el intérprete de Python emite un KeyError. Nos encontramos con KeyError cuando intentamos acceder al valor de claves que no existen, es decir, 'Grit' y 'clave inexistente'.
libros_autores['Grit']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-6-e1a4486f5ced> in <module>
---->
1 books_authors['Grit']
KeyError: 'Grit'
books_authors['clave-no-existente']
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-7-a3efd56f69e5> in <module>
---->
1 books_authors['clave-no-existente']
KeyError: 'clave-no-existente'
Entonces, ¿cómo manejar KeyErrors en Python?
Hay algunas formas de hacerlo, y las aprenderemos en la siguiente sección.
Cómo manejar KeyErrors en Python

Aprendamos cómo manejar KeyErrors usando:
- Sentencias condicionales if-else
- Bloques try-except
- El método del diccionario
.get()
#1. Uso de sentencias condicionales if-else
Una de las formas más sencillas de manejar KeyErrors en Python es utilizando las sentencias condicionales if-else.
En Python, las sentencias if-else tienen la siguiente sintaxis general:
if condición:
# haga esto
else:
# haga otra cosa
- Si la condición es
Verdadera
, se ejecutan las sentencias en el cuerpo delif
, y - Si la condición es
Falsa
, se ejecutan las sentencias en el cuerpoelse
.
En este ejemplo, la condición es comprobar si la clave está presente en el diccionario.
Si la clave está presente en el diccionario, el operador in
devolverá True
, y el cuerpo si se ejecutará imprimiendo el valor correspondiente.
clave = 'La ecuación de la felicidad'
si clave en libros_autores:
print(libros_autores<x><x>[clave]</x></x>)
else:
print('¡Lo sentimos, esta clave no existe!')
# Salida
# Neil Pasricha
Si la clave no está presente en el diccionario, el operador in
devuelva False
y se ejecuta el cuerpo else
. Imprime un mensaje indicando que la clave no está presente.
clave = 'clave-no-existente'
si clave en libros_autores:
print(libros_autores<x><x>[clave]</x></x>)
else:
print('¡Lo sentimos, esta clave no existe!')
# Salida
# ¡Lo sentimos, esta clave no existe!
#2. Uso de sentencias Try-Except

Otro método común para manejar KeyError es utilizar las sentencias try-except en Python.
Lea el siguiente bloque de código:
key = 'clave-no-existente'
try:
print(books_authors<x><x>[key]</x></x>)
except KeyError:
print('¡Lo sentimos, esta clave no existe!')
- El bloque pruebe intenta recuperar el valor correspondiente a la clave proporcionada.
- Si la clave no está presente, el intérprete lanza un KeyError que se gestiona como una excepción dentro del bloque excepto.
#3. Uso del método .get()
En Python, puede utilizar el método de diccionario incorporado .get() para manejar las claves que faltan.
La sintaxis general para utilizar el método
get
() esdict.get(clave,valor_por_defecto)
dóndedict
es un objeto diccionario válido en Python.- Si la clave está presente en el diccionario, el método get(
)
devuelve el valor.
- Si no, devuelve el valor por defecto.
En este ejemplo, keys
es una lista de claves a cuyos valores queremos acceder. Recorremos en bucle la lista de claves para recuperar los valores correspondientes del diccionario books_authors
.
Aquí, hemos utilizado el método .get() con 'No existe' como valor por defecto.
keys = ['Grit','Hyperfocus','Make Time','Deep Work']
for key in keys:
print(books_authors.get(key,'No existe'))
En el código anterior
- Para las claves que están presentes en el diccionario
books_authors
, el método.get(
) devuelve los valores correspondientes. - Cuando las claves no existen, en este caso, 'Grit' y 'Make Time', el método .get() devuelve el valor por defecto 'Does not exist'.
# Salida
No existe
Chris Bailey
No existe
Cal Newport
Todos los métodos anteriores nos ayudan en la gestión de errores clave. Sin embargo, son verbosos y requieren que manejemos explícitamente las claves que faltan. Puede simplificar este proceso utilizando un defaultdict en lugar de un diccionario normal.
Defaultdict en Python

El defaultdict es una subclase de la clase diccionario(dict
). Por tanto, hereda el comportamiento de un diccionario Python. Además, también maneja las claves que faltan de forma nativa.
El defaultdict es un tipo de contenedor de datos que está incorporado en la biblioteca estándar de Python - dentro del módulo collections
.
Así que tiene que importarlo a su entorno de trabajo:
from colecciones import defaultdict
He aquí la sintaxis general para utilizar defaultdict
:
defaultdict(default_factory)
Puede especificar un callable como int, float o list como atributo default_factory
. Si no proporciona un valor para default_factory
, por defecto será None
.
Cuando la clave que busca no está presente, se activa el método __missing__(
), que infiere el valor por defecto a partir de default_factory
. A continuación, devuelva este valor por defecto.
En resumen:
- En Python, un
defaultdict
devuelve el valor por defecto cuando la clave no está presente. - También añade este par clave-valor por defecto al diccionario, que usted puede modificar.
Ejemplos de Defaultdict en Python

A continuación, codificaremos algunos ejemplos para entender cómo funciona defaultdict en Python.
Defaultdict en Python con valor entero por defecto
En primer lugar, importe defaultdict
del módulo collections
.
from colecciones import defaultdict
import random
Creemos un defaultdict precios
.
precios = defaultdict(int)
Ahora poblamos el diccionario de precios
utilizando los elementos de la lista de frutas
como claves. Y muestreamos aleatoriamente los valores de la lista_precios
para obtener los valores.
lista_precios = [10,23,12,19,5]
frutas = ['manzana','fresa','granada','arándano']
para fruta en frutas:
precios[fruta] = random.choice(lista_precios)
Echemos un vistazo a los pares clave-valor en el defaultdict de precios
.
print(precios.items())
dict_items([('manzana', 12), ('arándano', 19), ('granada', 5), ('fresa', 10)])
Al igual que un diccionario Python normal, puede acceder a los valores del defaultdict precios
utilizando las claves:
precios['manzana']
# 23
Ahora, intentemos acceder al precio de una fruta que no esté presente, digamos, 'naranja'. Vemos que devuelve el valor por defecto de cero.
precios['naranja']
# 0
Si imprimimos el diccionario, vemos que se ha añadido una nueva clave 'naranja' con el valor entero por defecto de cero.
print(precios.items())
dict_items([('manzana', 12), ('arándano', 19), ('granada', 5), ('fresa', 10), ('naranja', 0)])
Defaultdict en Python con lista como valor por defecto
Definamos students_majors
as a defaultdict
de listas. Los nombres de las especialidades son las claves. Y los valores son las listas de estudiantes que cursan cada una de las especialidades, como matemáticas, economía, informática, etc.
from collections import defaultdict
students_majors = defaultdict(list)
Si intentamos acceder a la lista de estudiantes correspondiente a 'Economía', defaultdict devuelve una lista vacía; ¡sin errores de clave!
students_majors['Economía']
# []
Ahora tenemos una lista vacía asignada a la especialidad de 'Economía'. Así que ahora podemos añadir elementos a esta lista utilizando el método de lista .append()
.
students_majors['Economía'].append('Alex')
Se ha creado una entrada para 'Economía' en el diccionario por defecto students_majors
.
print(estudiantes_disciplinas)
defaultdict(<clase 'lista'>, {'Economía': ['Alex']})
Puede añadir más estudiantes a la lista asignada a la especialidad de Economía, añadir una nueva especialidad, ¡y mucho más!
students_majors['Economía'].append('Bob')
students_majors['Matemáticas'].append('Laura')
print(students_majors)
defaultdict(<clase 'list'>, {'Economía': ['Alex', 'Bob'], 'Matemáticas': ['Laura']})
Conclusión
Espero que este tutorial le haya ayudado a entender cómo y cuándo debe utilizar defaultdict en Python. Después de ejecutar los ejemplos de código en este tutorial, puede intentar utilizar defaultdict como la estructura de datos preferida en sus proyectos cuando sea necesario.
He aquí un resumen de lo que ha aprendido en este tutorial.
- Cuando trabaje con un diccionario Python, a menudo se encontrará con KeyErrors.
- Para manejar estos KeyErrors puede utilizar algunos métodos verbales. Puede utilizar sentencias condicionales, bloques try-except o el método .get(). Pero el tipo de datos defaultdict del módulo collections puede simplificar este manejo de KeyError.
- Puede utilizar defaultdict (default_factory) dónde default_factory es un callable válido.
- Cuando la clave no está presente en defaultdict, el valor por defecto (inferido de default_factory) y la clave se añaden a defaultdict.
A continuación, consulte el tutorial sobre la función map de Python.