Apuntes sobre Python

La indentación no es estilo: es sintaxis.

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.

TOP