Saltar a contenido

Uso de diccionarios

Los diccionarios (o "dics") son estructuras de datos que nos permiten asociar un valor con otro, similar a un diccionario humano que relaciona palabras con sus definiciones.

¿Qué es un diccionario?

Un diccionario en Python es una colección bidimensional de pares "clave-valor". Esto significa que cada "clave" (key en inglés) se asocia con un "valor" (value en inglés).

Podemos entender esta estructura de datos asociándola a lo que es un diccionario en el mundo humano. Si abrieras un diccionario, ya sea en español, en inglés o en cualquier otro idioma, te encontrarías con un montón de palabras y definiciones.

Por ejemplo, en un diccionario que contiene información sobre estudiantes, la clave podría ser el nombre del estudiante y el valor podría ser su especialidad técnica.

Esas palabras y definiciones, en el mundo informático y en la programación se definen de una manera más genérica como claves y valores, algo asociado con otra cosa. Esto es todo lo que es un diccionario.

¡Para recordar!

Los diccionarios se definen utilizando llaves {} (curly braces en inglés) y los pares clave-valor se separan por comas.

Hemos visto llaves en el contexto de las cadenas de formato (f-strings) que no tienen ninguna relación con los diccionarios. A veces, los desarrolladores de un lenguaje se quedan sin teclas en el teclado y necesitan empezar a reutilizar símbolos de diferentes maneras. Eso es lo que está a punto de suceder. Estamos usando llaves de una manera diferente.

Con esta descripción, podemos decir que un diccionario es una estructura de datos que nos permite asociar un valor con otro. Y fíjate, esto ya es más poderoso y más interesante que una lista, que es simplemente un conjunto de múltiples valores pero sin asociación entre ellos:

Python
# Crea una lista de estudiantes
estudiantes = ['Juan', 'María', 'Pedro']

# Crea una lista de especialidades
especialidades = ['Electricidad', 'Mecánica', 'Electrónica']

En este caso, tenemos dos listas, una con los nombres de los estudiantes y otra con las especialidades.

Pero, ¿cómo sabemos cuál es la especialidad de cada estudiante?

No hay una relación directa entre los elementos de las dos listas. Podríamos tener a Juan en la posición 0 de la lista de estudiantes y a Electricidad en la posición 0 de la lista de especialidades, pero no hay una relación directa entre ellos. María podría estar en la posición 1 de la lista de estudiantes y Mecánica en la posición 1 de la lista de especialidades, pero no hay una relación directa entre ellos tampoco.

Y si las listas comienzan a crecer, se vuelve más y más difícil mantener esa relación. Seguramente la lógica y el funcionamiento del programa no terminarán siendo los esperados.

¿Qué pasa si queremos saber cuál es la especialidad de Pedro? Tendríamos que buscar en la lista de estudiantes a Pedro, recordar su posición y luego buscar en la lista de especialidades a la misma posición. Esto se vuelve complicado y propenso a errores.

¿Cómo podemos resolver este problema?

¡Con un diccionario! Vamos a ver cómo se hace.

Definición de un diccionario

Imaginemos que queremos llevar un registro de los estudiantes de un colegio técnico electromecánico y sus respectivas especialidades. En lugar de usar listas, que pueden volverse confusas, utilizaremos un diccionario para mantener todo organizado.

Primero, vamos a crear un diccionario vacío para almacenar la información de los estudiantes:

Python
# Crear un diccionario vacío
estudiantes = {}

En este código, estudiantes = {} crea un diccionario vacío llamado estudiantes.

Colección de pares "clave-valor"

Una colección de pares "clave-valor" es un concepto fundamental en la programación, especialmente en lenguajes como Python, utilizado en estructuras de datos de tipo diccionario.

A continuación, exploraremos qué son, cómo funcionan y sus características principales.

¿Qué es un Par "Clave-Valor"?

  • Clave: Es un identificador único que se utiliza para acceder a un valor específico dentro de la colección. Las claves deben ser únicas dentro del mismo diccionario.

  • Valor: Es el dato que se asocia a una clave. Puede ser de cualquier tipo de dato: números, cadenas, listas, otros diccionarios, etc.

Características de las Colecciones de Pares "Clave-Valor"

  • Acceso Rápido: Puedes acceder a los valores utilizando sus claves de manera muy eficiente, lo que permite búsquedas rápidas.

  • Orden: A partir de Python 3.7, los diccionarios mantienen el orden de inserción, lo que significa que puedes iterar sobre ellos en el mismo orden en que fueron creados.

  • Mutabilidad: Los diccionarios son mutables, lo que significa que puedes agregar, modificar o eliminar pares "clave-valor" después de haber creado el diccionario.

  • Tipos de Clave: Las claves deben ser de un tipo inmutable, como cadenas, números o tuplas. No puedes usar listas u otros diccionarios como claves.

Usos Comunes

Las colecciones de pares "clave-valor" son ampliamente utilizadas en diversas aplicaciones, tales como:

  • Almacenamiento de configuraciones.

  • Gestión de datos en bases de datos.

  • Creación de índices para búsquedas rápidas.

  • Representación de objetos en programación orientada a objetos.

Conclusión

Las colecciones de pares "clave-valor" son una herramienta poderosa en la programación que permite organizar y acceder a datos de manera eficiente.

Su uso en diccionarios facilita la creación de estructuras de datos complejas y la manipulación de información en diversas aplicaciones.

Agregar Elementos al Diccionario

Como dijimos, un diccionario nos permite asociar "algo" con "otro algo". En nuestro caso, queremos asociar a cada estudiante con su especialidad.

Por ejemplo, supongamos que tenemos tres estudiantes: Juan, María y Pedro, que están en las especialidades de Electricidad, Mecánica y Electrónica, respectivamente:

Nombre Especialidad
Juan Electricidad
María Mecánica
Pedro Electrónica

Para agregar elementos a un diccionario en Python, simplemente asignamos un valor a una nueva clave. Esto se puede hacer de manera directa utilizando la sintaxis de corchetes.

Sintaxis Básica

Vamos a agregar al primer estudiante, Juan, con su especialidad de Electricidad al diccionario estudiantes. La forma más sencilla de agregar un nuevo par "clave-valor" es la siguiente:

Python
# Agregar un nuevo estudiante al diccionario
estudiantes['Juan'] = 'Electricidad'

En este código, estamos agregando un estudiante al diccionario estudiantes. Cada estudiante que se ingrese será representado con una clave (nombre) y un valor (especialidad).

La sintaxis estudiantes['Juan'] = 'Electricidad' asigna la especialidad "Electricidad" al estudiante "Juan" en el diccionario estudiantes.

De esta manera, hemos creado un diccionario que asociará a cada estudiante con su especialidad.

Si imprimimos el diccionario estudiantes, obtendremos el siguiente resultado:

Python
print(estudiantes)
Terminal (Entrada/Salida)
{'Juan': 'Electricidad'}

Agregar múltiples elementos

Ahora ya sabemos como agregar un elemento a nuestro diccionario. Pero, ¿qué pasa si queremos agregar varios elementos a la vez? O incluso, ¿qué pasa si queremos agregar varios elementos de manera dinámica, sin saber cuántos elementos vamos a agregar? No podemos escribir un código, de antemano, para cada uno de ellos.

Por suerte, Python nos permite agregar elementos de manera dinámica, sin importar cuántos elementos queramos agregar.

¿Cómo? Claro, con un bucle for. Veamos, entonces, como agregar al resto de los estudiantes al diccionario estudiantes:

Python
# Diccionario actual
estudiantes = {
    'Juan': 'Electricidad'
}

# Lista de nuevos estudiantes y sus especialidades
nuevos_estudiantes = {
    'María': 'Mecánica',
    'Pedro': 'Electrónica'
}

# Agregar nuevos estudiantes al diccionario
for nombre, especialidad in nuevos_estudiantes.items():
    estudiantes[nombre] = especialidad

# imprimir el diccionario de estudiantes
print(estudiantes)

En este código, estamos iterando sobre un nuevo diccionario nuevos_estudiantes y agregando cada uno de sus elementos al diccionario estudiantes.

La función items() nos permite obtener una lista de tuplas con las claves y los valores del diccionario. Luego, utilizamos un bucle for para recorrer cada una de estas tuplas y agregarlas al diccionario estudiantes. No te preocupes por este nuevo término, las tuplas son otro tipo de estructura de datos en Python que veremos más adelante.

Si ejecutamos este código, obtendremos el siguiente resultado:

Terminal (Entrada/Salida)
{'Juan': 'Electricidad', 'María': 'Mecánica', 'Pedro': 'Electrónica'}

¡Para recordar!

La función items() nos permite obtener una lista de tuplas con las claves y los valores de un diccionario. Y la estructura de control for nos permite recorrer cada una de estas tuplas y agregarlas al diccionario estudiantes. Pra ello, debes respetar la sintaxis for nombre, especialidad in nuevos_estudiantes.items(): que te permite desempaquetar las tuplas en dos variables: nombre y especialidad. Siempre la primera variable, nombre en este caso, se asocia con la clave y la segunda variable, especialidad, con el valor.

Ejemplo Práctico

Si analizamos el programa anterior:

Python
# Diccionario actual
estudiantes = {
    'Juan': 'Electricidad'
}

# Lista de nuevos estudiantes y sus especialidades
nuevos_estudiantes = {
    'María': 'Mecánica',
    'Pedro': 'Electrónica'
}

# Agregar nuevos estudiantes al diccionario
for nombre, especialidad in nuevos_estudiantes.items():
    estudiantes[nombre] = especialidad

# imprimir el diccionario de estudiantes
print(estudiantes)

Podemos ver que pasamos los elementos del diccionario nuevos_estudiantes, escrito de manera estática, a otro diccionario estudiantes. Dicho de esta manera suena raro el proceso porque justamente es lo que queremos evitar: crear un diccionario de manera estática por los motivos antes mencionados.

Entonces, te propongo refactorizar1 el código anterior para que sea más dinámico y podamos agregar elementos al diccionario de manera más flexible. Es decir, que el usuario pueda agregar nuevos estudiantes y sus especialidades sin tener que modificar el código fuente.

¿Se te ocurre como hacerlo? Te doy algunas pistas: puedes utilizar la función input() para solicitar al usuario los datos de los estudiantes y sus especialidades. Luego, puedes crear una función que reciba estos datos y los agregue al diccionario. Al final del ingreso, debes imprimir el diccionario para ver los cambios.

¿Te animas a hacerlo? ¡Inténtalo!

Haz clic aquí para ver la solución propuesta
Python
# Crear un diccionario vacío
estudiantes = {}

# Función para agregar un estudiante al diccionario
def agregar_estudiante(estudiantes):
    # Solicitar al usuario el nombre del estudiante
    nombre = input("Ingrese el nombre del estudiante: ")

    # Solicitar al usuario la especialidad del estudiante
    especialidad = input("Ingrese la especialidad del estudiante: ")

    # Agregar el estudiante al diccionario
    estudiantes[nombre] = especialidad


# Bucle para agregar múltiples estudiantes
while True:
    # Agregar nuevos estudiantes al diccionario
    agregar_estudiante(estudiantes)

    # Imprimir el diccionario de estudiantes
    print("\nLista de estudiantes:")
    print(estudiantes, end='\n\n')

    # Solicitar al usuario si desea agregar otro estudiante
    respuesta = input("¿Desea agregar otro estudiante? (s/n): ")

    if respuesta.lower() != 's':
        break

    print()

print("Ha finalizado el ingreso de estudiantes", "¡Gracias por utilizar el programa!", sep='\n')

En este código, hemos creado una función agregar_estudiante() que solicita al usuario el nombre y la especialidad del estudiante y los agrega al diccionario estudiantes.

Luego, utilizamos un bucle while para permitir al usuario agregar múltiples estudiantes de manera dinámica. Al final de cada ingreso imprimimos el diccionario de estudiantes.

Luego, solicitamos al usuario si desea agregar otro estudiante. Si la respuesta es diferente de 's', salimos del bucle y finalizamos el programa.

Si ejecutas este código, podrás agregar múltiples estudiantes y sus especialidades al diccionario de manera dinámica. Vamos a probarlo con nuestra lista de estudiantes:

Terminal (Entrada/Salida)
Ingrese el nombre del estudiante: Juan
Ingrese la especialidad del estudiante: Electricidad

Lista de estudiantes:
{'Juan': 'Electricidad'}

¿Desea agregar otro estudiante? (s/n): s

Ingrese el nombre del estudiante: María
Ingrese la especialidad del estudiante: Mecánica

Lista de estudiantes:
{'Juan': 'Electricidad', 'María': 'Mecánica'}

¿Desea agregar otro estudiante? (s/n): s

Ingrese el nombre del estudiante: Pedro
Ingrese la especialidad del estudiante: Electrónica

Lista de estudiantes:
{'Juan': 'Electricidad', 'María': 'Mecánica', 'Pedro': 'Electrónica'}

¿Desea agregar otro estudiante? (s/n): n

Ha finalizado el ingreso de estudiantes
¡Gracias por utilizar el programa!

De esta manera, hemos creado un programa que permite al usuario agregar estudiantes y sus especialidades de manera dinámica, sin tener que modificar el código fuente.

Recuerda que esta solución es solo una solución propuesta. No significa que si escribiste otro programa, el tuyo esté mal. Si tu programa resuelve el problema, entonces es un buen programa. Luego, ya tendrás tiempo de mejorarlo si es que es necesario.

¡Diviértete programando!

Formatear el código de un diccionario

Hasta ahora, hemos creado un diccionario con varios pares "clave-valor" y hemos agregado elementos a él. Pero, ¿cómo podemos formatear el código de un diccionario para que sea más legible y estéticamente agradable?

Normalmente, uno escribiría un diccionario, de corrido, de la siguiente manera:

Python
# Almacenar en el diccionario a los estudiantes y sus especialidades
estudiantes = { 'Juan': 'Electricidad', 'María': 'Mecánica', 'Pedro': 'Electrónica' }

Como podrás ver, este código es difícil de leer y no es muy agradable visualmente.

¿Cómo podemos mejorar esto? De la siguiente manera:

Python
# Almacenar en el diccionario a los estudiantes y sus especialidades
estudiantes = {
    'Juan': 'Electricidad',
    'María': 'Mecánica',
    'Pedro': 'Electrónica'
}

¡Buena práctica!

En Python, y en otros lenguajes de programación, es perfectamente aceptable formatear el código, distribuyendo la sintaxis de una línea de código en varias líneas, para que sea más legible y estéticamente más agradable y atractiva.

En el caso de los diccionarios, se recomienda colocar cada par "clave-valor" en una línea separada, con una coma al final de cada línea, e indentar (tabular) cada valor para que sea más fácil de leer y entender.

¡Recuerda que la legibilidad del código es muy importante! Un código legible es más fácil de mantener y de depurar en caso de errores.

En este código, estudiantes = {'Juan': 'Electricidad', 'María': 'Mecánica', 'Pedro': 'Electrónica'} crea un diccionario llamado estudiantes con tres pares "clave-valor".

Cada clave es el nombre de un estudiante y cada valor es su especialidad.

Podemos ver que las claves están a la izquierda y los valores a la derecha, y están asociados (aunque separados) por dos puntos :.

De esta manera, hemos creado un diccionario que asocia a cada estudiante con su especialidad.

Así es como conseguimos la implementación en código de esta idea:

Nombre Especialidad
Juan Electricidad
María Mecánica
Pedro Electrónica

Acceso a los elementos de un diccionario

¿Cómo utilizamos nuestro código de una manera interesante?

La sintaxis es casi la misma que utilizamos para acceder a los elementos de una lista.

Debemos invocar el nombre de la variable que contiene al diccionario, estudiantes, y acceder a dicha variable, a una posición específica dentro de ella, llamada índice (índice en inglés).

Si recuerdas, en las listas, los índices son números enteros: 0, 1, 2; que representan la posición de un elemento en la lista. En los diccionarios, los índices son las claves que hemos definido para cada elemento: 'Juan', 'María', 'Pedro'; respectivamente.

¡Para recordar!

Los diccionarios te permiten usar palabras reales como índices para ingresar a ellos, acceder a los elementos almacenados.

Solo debes recordar que las claves son únicas, es decir, no puedes tener dos claves iguales en un diccionario. Si intentas agregar una clave que ya existe, el valor anterior se sobrescribirá con el nuevo valor.

Los valores, en cambio, pueden ser duplicados. Es decir, puedes tener dos o más valores iguales en un diccionario, pero no dos claves iguales.

Entonces, para acceder a la especialidad de un estudiante, simplemente utilizamos su nombre como clave. Por ejemplo, si queremos saber la especialidad de María, lo haríamos así:

Python
# Acceder a la especialidad de un estudiante
especialidad_maria = estudiantes['María']

print(especialidad_maria)  # Output: Mecánica

En este código, estudiantes['María'] devuelve la especialidad de María, que es "Mecánica". Luego, se imprime el valor de especialidad_maria en la consola.

Si quisieras saber la especialidad de Juan, simplemente cambiarías 'María' por 'Juan' en el código anterior.

Python
# Acceder a la especialidad de un estudiante
especialidad_juan = estudiantes['Juan']

print(especialidad_juan)  # Output: Electricidad

O si quisieras saber la especialidad de Pedro, simplemente cambiarías 'María' por 'Pedro' en el código original.

Python
# Acceder a la especialidad de un estudiante
especialidad_pedro = estudiantes['Pedro']

print(especialidad_pedro)  # Output: Electrónica

De esta manera, puedes acceder a los valores de un diccionario utilizando las claves asociadas a ellos.

Referencias


  1. Refactorizar: Es el proceso de reestructurar un código existente sin cambiar su comportamiento externo. El objetivo es mejorar la legibilidad y el mantenimiento del código, haciéndolo más eficiente y fácil de entender.