Diccionarios (Casilleros de Seguridad)
El Diccionario (dict) es la estructura de almacenamiento más flexible de Python, y si tuvieras que aprender una sola, sería esta. A diferencia de las listas, donde buscas por número de ranura, aquí buscas por nombre propio.
Imagina un banco de Casilleros de Seguridad. Nadie pide “la caja 43”. Piden “la caja de Juan Pérez”.
Fig. 5.3: Un diccionario: claves únicas que localizan valores.
Anatomía de un Diccionario
Todo funciona en parejas Clave : Valor (Key : Value).
- Clave (Key): La etiqueta en la puerta (p. ej. “Nombre”). Debe ser única.
- Valor (Value): Lo que hay adentro (p. ej. “Elena”).
Gestión de Casilleros
1. Construcción
Usamos llaves {} y separamos la clave del valor con dos puntos :.
# Nombre : Tipo = { Clave : Valor }
usuario : dict[str, str] = {
"nombre": "Elena",
"rol": "Admin",
"email": "[email protected]"
}
2. Recuperación
Usamos la clave entre corchetes para abrir la puerta:
print(usuario["nombre"]) # Sale: "Elena"
Pero ojo con el casillero que no existe: pedir una clave ausente con corchetes rompe el programa con un KeyError.
print(usuario["edad"]) # KeyError: 'edad' ← el programa se detiene aquí
Cuando no estás seguro de que la clave exista, usa .get(). Devuelve None (o el valor por defecto que tú indiques) en vez de reventar:
print(usuario.get("edad")) # None, sin error
print(usuario.get("edad", "N/D")) # "N/D" (tu valor por defecto)
.get() es la diferencia entre un programa que avisa y uno que se cae. Úsalo siempre que la clave dependa de datos externos: un formulario, un archivo, la respuesta de un usuario.
3. Modificación y Creación
Si usas una clave que ya existe, cambias el contenido. Si usas una clave nueva, Python crea un casillero nuevo mágicamente.
# Modificar existente
usuario["rol"] = "SuperUser"
# Crear nuevo
usuario["telefono"] = "555-0101"
4. Clausura de Casilleros
Cuando un casillero deja de usarse, se desocupa. Tienes dos llaves maestras:
# Cerrar y tirar el contenido
del usuario["telefono"]
# Cerrar pero quedarte con el contenido en la mano
email_guardado: str = usuario.pop("email")
print(email_guardado) # "[email protected]"
del simplemente elimina la pareja clave-valor. .pop() hace lo mismo, pero te devuelve el valor antes de destruir el casillero. Útil cuando necesitas el dato una última vez.
5. Recorrer el Banco
Casi siempre quieres las parejas completas, y .items() te da clave y valor a la vez:
for clave, valor in usuario.items():
print(f"{clave}: {valor}")
Si solo necesitas las etiquetas, usa .keys(); si solo los contenidos, .values(). Y para saber si un casillero existe antes de abrirlo, usa in, que en un diccionario mira las claves, no los valores:
if "nombre" in usuario:
print("Tiene nombre registrado")
(Recorrer con for es tema del Capítulo 8; aquí basta con saber que .items() es la puerta de entrada.)
Cajas dentro de casilleros
Un diccionario suelto describe un producto. Un almacén tiene muchos. La forma natural de guardarlos es una lista donde cada elemento es un diccionario:
inventario: list[dict] = [
{"nombre": "Tornillos", "precio": 5.5, "stock": 500},
{"nombre": "Tuercas", "precio": 3.0, "stock": 200},
]
Fíjate en dos cosas. Primera: los valores ya no son puro texto. precio guarda un float y stock un int; un diccionario mezcla tipos sin quejarse. Segunda: para llegar a un dato encadenas los accesos, de afuera hacia adentro.
print(inventario[0]["nombre"]) # "Tornillos": elemento 0, casillero "nombre"
print(inventario[1]["stock"]) # 200
inventario[0] te entrega el primer diccionario completo; el ["nombre"] que sigue abre su casillero. Guárdate esta estructura. La lista de diccionarios es exactamente donde vivirá el almacén entero del proyecto final.
La ventaja: velocidad constante
A Python le toma prácticamente el mismo tiempo localizar un dato en un diccionario de 10 elementos que en uno de 10 millones. No es magia: es la tabla hash que trabaja por debajo. Por eso los diccionarios son la columna vertebral de bases de datos, configuraciones de sistema y cualquier estructura donde el acceso por nombre sea prioritario.