Tuplas y diccionarios
Las listas no son la única forma de agrupar datos en Python. Las tuplas son colecciones ordenadas e inmutables, y los diccionarios permiten acceder a los valores por nombre en lugar de por posición.
Tuplas
Qué es una tupla
Una tupla es como una lista, pero inmutable: una vez creada, no se puede modificar. Se escribe con paréntesis en lugar de corchetes:
>>> coordenadas = (40.416, -3.703)
>>> colores_rgb = (255, 128, 0)
>>> vacia = ()
El acceso por índice funciona exactamente igual que con las listas:
>>> print(coordenadas[0])
40.416
>>> print(coordenadas[-1])
-3.703
Pero intentar modificar un elemento lanza un error:
>>> coordenadas[0] = 0
TypeError: 'tuple' object does not support item assignment
Lo que sí puedes hacer es reasignar la variable a una tupla completamente nueva:
>>> coordenadas = (43.263, -2.935) # ahora apunta a otra tupla
>>> print(coordenadas[0])
43.263
No estás modificando la tupla original: estás creando una nueva y haciendo que el nombre apunte a ella. La distinción importa: si otra variable guardaba referencia a la tupla anterior, seguirá viendo los valores originales:
>>> coordenadas = (40.416, -3.703)
>>> copia = coordenadas # copia apunta a la misma tupla
>>> coordenadas = (43.263, -2.935) # coordenadas ahora apunta a una tupla nueva
>>> print(coordenadas)
(43.263, -2.935)
>>> print(copia) # copia sigue viendo la tupla original
(40.416, -3.703)
Cuándo usar una tupla
La inmutabilidad no es un defecto, es una garantía. Usa una tupla cuando los datos no deban cambiar: coordenadas geográficas, colores RGB, una fecha, los días de la semana. Si alguien lee tu código y ve una tupla, sabe que ese conjunto de valores es fijo por diseño.
Las listas son para colecciones que crecen, se filtran o se modifican. Las tuplas son para datos que simplemente se agrupan.
Desempaquetado de tuplas
Python permite asignar los elementos de una tupla (o cualquier secuencia) a variables individuales en una sola línea. Se llama desempaquetado:
>>> punto = (10, 20)
>>> x, y = punto
>>> print(x)
10
>>> print(y)
20
También funciona con listas y es muy habitual al recorrer pares de valores:
>>> persona = ("ignacio", "zaragoza", 40)
>>> nombre, ciudad, edad = persona
>>> print(nombre, "vive en", ciudad)
ignacio vive en zaragoza
Nota: El número de variables debe coincidir exactamente con el número de elementos, o Python lanza un ValueError.
Diccionarios
Qué es un diccionario
Un diccionario almacena pares clave: valor. En lugar de acceder a los datos por su posición numérica, se accede por nombre. Es el equivalente a los arrays asociativos de PHP o los objetos de JavaScript.
>>> persona = {"nombre": "ignacio", "ciudad": "zaragoza", "edad": 40}
Se escribe entre llaves {}, con cada par separado por coma y la clave separada del valor por dos puntos. Las claves suelen ser strings, aunque pueden ser números o tuplas.
Acceder a los valores
Se accede con la clave entre corchetes, igual que el índice en las listas:
>>> print(persona["nombre"])
ignacio
>>> print(persona["edad"])
40
Si la clave no existe, Python lanza un KeyError. Para evitarlo, usa .get(), que devuelve None por defecto (o el valor que le indiques) si la clave no existe:
>>> print(persona.get("email"))
None
>>> print(persona.get("email", "no disponible"))
no disponible
Modificar, añadir y eliminar
Para modificar un valor o añadir una clave nueva, la sintaxis es la misma: asignación directa.
>>> persona["ciudad"] = "madrid" # modifica una clave existente
>>> persona["profesion"] = "ingeniero" # añade una clave nueva
>>> print(persona)
{'nombre': 'ignacio', 'ciudad': 'madrid', 'edad': 40, 'profesion': 'ingeniero'}
Para eliminar una clave, usa del o .pop(). .pop() devuelve el valor eliminado:
>>> del persona["profesion"]
>>> edad = persona.pop("edad")
>>> print(edad)
40
>>> print(persona)
{'nombre': 'ignacio', 'ciudad': 'madrid'}
Para comprobar si una clave existe, usa in:
>>> print("nombre" in persona)
True
>>> print("email" in persona)
False
Recorrer un diccionario
Por defecto, el for itera sobre las claves:
>>> config = {"host": "localhost", "puerto": 5432, "bd": "ventas"}
>>> for clave in config:
... print(clave)
host
puerto
bd
Con .items() obtienes cada par clave-valor, que puedes desempaquetar directamente:
>>> for clave, valor in config.items():
... print(clave, "→", valor)
host → localhost
puerto → 5432
bd → ventas
Si solo necesitas las claves o los valores por separado:
>>> print(list(config.keys()))
['host', 'puerto', 'bd']
>>> print(list(config.values()))
['localhost', 5432, 'ventas']
Diccionarios anidados
Los valores de un diccionario pueden ser cualquier tipo, incluidos otros diccionarios o listas:
>>> usuarios = {
... "ignacio": {"ciudad": "zaragoza", "edad": 40},
... "cristina": {"ciudad": "madrid", "edad": 35},
... }
>>> print(usuarios["ignacio"]["ciudad"])
zaragoza
>>> print(usuarios["cristina"]["edad"])
35
Este patrón es muy habitual al trabajar con datos JSON, que veremos más adelante.
En la próxima lección: funciones: cómo definir bloques de código reutilizables con def.