Geekflare recibe el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliación de los enlaces de compra en este sitio.
En Desarrollo Última actualización: 24 de septiembre de 2023
Compartir en:
Escáner de seguridad de aplicaciones web Invicti - la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

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?

1

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

How-to-Handle-KeyErrors-in-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 del if, y
  • Si la condición es Falsa, se ejecutan las sentencias en el cuerpo else.

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

2

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 () es dict.get(clave,valor_por_defecto) dónde dict 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

python-defaultdict

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

Defaultdict-Examples-1

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.

  • Bala Priya C
    Autor
Gracias a nuestros patrocinadores
Más lecturas sobre desarrollo
Potencia tu negocio
Algunas de las herramientas y servicios que le ayudarán a hacer crecer su negocio.
  • Invicti utiliza el Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en tan solo unas horas.
    Pruebe Invicti
  • Web scraping, proxy residencial, gestor de proxy, desbloqueador web, rastreador de motores de búsqueda, y todo lo que necesita para recopilar datos web.
    Pruebe Brightdata
  • Monday.com es un sistema operativo de trabajo todo en uno que te ayuda a gestionar proyectos, tareas, trabajo, ventas, CRM, operaciones, flujos de trabajo y mucho más.
    Prueba Monday
  • Intruder es un escáner de vulnerabilidades en línea que encuentra puntos débiles de ciberseguridad en su infraestructura, para evitar costosas violaciones de datos.
    Prueba Intruder