Programación con Python: Diccionarios

Los diccionarios de Python son una estructura de datos extremadamente útil y versátil, ya que permiten almacenar y organizar datos en pares clave-valor. Cada elemento en un diccionario está compuesto por una clave única y su valor correspondiente. Los diccionarios son ampliamente utilizados en el desarrollo de aplicaciones, y su capacidad para manejar datos complejos y anidados los convierte en una herramienta esencial. A continuación explicaremos la funcionalidad básica sobre diccionarios en Python, con explicaciones y ejemplos prácticos.

Creación de diccionarios

Podemos crear un diccionario en Python encerrando los pares clave-valor entre llaves {}. Cada par clave-valor se separa por dos puntos : y los pares se separan por comas:

# Diccionario vacío
diccionario_vacio = {}

# Diccionario de personas y sus edades
personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

# Diccionario con diferentes tipos de valores
datos = {"nombre": "Ana", "edad": 28, "es_estudiante": True}

Acceso a elementos

Podemos acceder a los valores de un diccionario utilizando sus claves. Para ello, podemos emplear la sintaxis nombre_diccionario[clave]:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

edad_juan = personas_edades["Juan"]    # 30
edad_maria = personas_edades["María"]  # 25

Si intentamos acceder a una clave que no existe en el diccionario, se generará un error. Para evitarlo, podemos usar el método get(), que permite obtener el valor de la clave o un valor predeterminado si la clave no existe:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

edad_juan = personas_edades.get("Juan")       # 30
edad_pedro = personas_edades.get("Pedro", 0)  # 0 (Pedro no está en el diccionario)

Modificación de elementos

Podemos modificar los valores de un diccionario utilizando la clave correspondiente:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

personas_edades["Juan"] = 32
personas_edades["María"] = 26

print(personas_edades)  # {"Juan": 32, "María": 26, "Carlos": 35}

Añadir elementos

Podemos añadir nuevos elementos a un diccionario simplemente asignando un nuevo par clave-valor:

personas_edades = {"Juan": 30, "María": 25}

personas_edades["Carlos"] = 35

print(personas_edades)  # {"Juan": 30, "María": 25, "Carlos": 35}

Eliminar elementos

Podemos eliminar elementos de un diccionario utilizando la palabra clave del seguida de la clave del elemento que queramos eliminar:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

del personas_edades["Juan"]

print(personas_edades)  # {"María": 25, "Carlos": 35}

Funciones y métodos disponibles para diccionarios

Los diccionarios en Python vienen acompañados con varios métodos útiles.

len()

La función len() nos permite obtener la cantidad de elementos (pares clave-valor) en el diccionario:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

cantidad_elementos = len(personas_edades)  # 3

keys(), values() e items()

Estos métodos permiten obtener las claves, los valores y los pares clave-valor del diccionario, respectivamente:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

claves = personas_edades.keys()              # dict_keys(['Juan', 'María', 'Carlos'])
valores = personas_edades.values()           # dict_values([30, 25, 35])
pares_clave_valor = personas_edades.items()  # dict_items([('Juan', 30), ('María', 25), ('Carlos', 35)])

pop()

El método pop() nos permite eliminar un elemento del diccionario y devolver su valor. También podemos proporcionar un valor predeterminado si la clave no existe en el diccionario:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

edad_carlos = personas_edades.pop("Carlos")   # 35
edad_pedro = personas_edades.pop("Pedro", 0)  # 0 (Pedro no está en el diccionario)

update()

El método update() nos permite fusionar un diccionario con otro. Si una clave existe en el diccionario original y en el diccionario que se está fusionando, el valor de la clave en el diccionario original se actualizará con el valor correspondiente del diccionario que se está fusionando. Si la clave no existe en el diccionario original, se agregará al diccionario junto con su valor:

diccionario1 = {"a": 1, "b": 2}
diccionario2 = {"b": 3, "c": 4}

diccionario1.update(diccionario2)

print(diccionario1)  # {'a': 1, 'b': 3, 'c': 4}

clear()

El método clear() nos permite eliminar todos los elementos del diccionario, dejándolo vacío:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

personas_edades.clear()

print(personas_edades)  # {}

Iteración en diccionarios

Podemos utilizar un bucle for para iterar sobre las claves o los elementos de un diccionario:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

# Iterar sobre las claves
for clave in personas_edades:
    print(clave)

# Iterar sobre los valores
for valor in personas_edades.values():
    print(valor)

# Iterar sobre los pares clave-valor
for clave, valor in personas_edades.items():
    print(f"{clave}: {valor}")

Comprobación de existencia en diccionarios

Podemos utilizar el operador in para comprobar si una clave existe en un diccionario:

personas_edades = {"Juan": 30, "María": 25, "Carlos": 35}

if "Juan" in personas_edades:
    print("La clave 'Juan' está en el diccionario.")

Diccionarios anidados

En Python, los diccionarios pueden estar anidados, es decir, podemos tener diccionarios dentro de diccionarios:

personas = {
    "Juan": {"edad": 30, "ciudad": "Madrid"},
    "María": {"edad": 25, "ciudad": "Barcelona"},
    "Carlos": {"edad": 35, "ciudad": "Sevilla"}
}

print(personas["Juan"]["edad"])     # 30
print(personas["María"]["ciudad"])  # "Barcelona"

Diccionarios y comprensión

También podemos utilizar la comprensión de diccionarios para crear diccionarios de manera muy simple. Por ejemplo, podemos crear un diccionario donde las claves son los números de una lista y los valores son el cuadrado de esos números:

numeros = [1, 2, 3, 4, 5]
diccionario_numeros = {numero: numero**2 for numero in numeros}

print(diccionario_numeros)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Diccionarios como argumentos de funciones

Los diccionarios son útiles cuando queremos pasar un número variable de argumentos a una función, tal como veremos en la unidad específica de funciones. En el siguiente ejemplo utilizamos **datos para indicar que la función aceptará un número variable de argumentos clave-valor y luego iteramos sobre los elementos del diccionario datos:

def imprimir_datos(**datos):
    for clave, valor in datos.items():
        print(f"{clave}: {valor}")

imprimir_datos(nombre="Ana", edad=28, ciudad="Madrid")
# Salida:
# nombre: Ana
# edad: 28
# ciudad: Madrid