Tuplas en Python: cuándo usarlas en vez de listas y cómo desempaquetarlas

Las tuplas parecen listas de segunda clase: sin append, sin remove, sin sort. En realidad son una elección deliberada de diseño. Su inmutabilidad las hace más rápidas, más seguras y capaces de hacer cosas que las listas no pueden, como servir de clave de diccionario.

Crear tuplas y la trampa del elemento único

# Tupla normal
punto = (3, 7)
rgb   = (255, 128, 0)
vacia = ()

# TRAMPA: una coma hace la diferencia
no_tupla = (42)    # esto es un int, no una tupla
si_tupla = (42,)   # esta sí es una tupla de un elemento
print(type(no_tupla))  # 
print(type(si_tupla))  # 

Por qué las tuplas pueden ser claves de diccionario

Los diccionarios de Python requieren que las claves sean hashables: objetos cuyo valor no cambia durante su vida útil. Las tuplas de elementos inmutables son hashables; las listas no lo son.

# Caché de coordenadas usando tuplas como claves
distancias = {}
distancias[(0, 0)] = 0
distancias[(3, 4)] = 5.0
distancias[(1, 1)] = 1.41

print(distancias[(3, 4)])  # 5.0

# Esto lanza TypeError: unhashable type: 'list'
# distancias[[3, 4]] = 5.0

Desempaquetado (unpacking)

El unpacking asigna cada elemento de una tupla a una variable distinta. Python lo soporta en asignaciones, bucles for y llamadas a funciones.

punto = (10, 20)
x, y = punto
print(x, y)  # 10 20

# Intercambio de variables sin temporal
a, b = 1, 2
a, b = b, a
print(a, b)  # 2 1

# Ignorar valores con _
datos = ("Ana", 32, "Madrid", "Ingeniería")
nombre, _, ciudad, _ = datos
print(nombre, ciudad)  # Ana Madrid

# Desempaquetado extendido con *
primero, *resto = (1, 2, 3, 4, 5)
print(primero)  # 1
print(resto)    # [2, 3, 4, 5]

*inicio, ultimo = (1, 2, 3, 4, 5)
print(inicio)   # [1, 2, 3, 4]
print(ultimo)   # 5

namedtuple: tuplas con nombres de campo

collections.namedtuple permite acceder a los elementos por nombre además de por índice, lo que hace el código mucho más legible:

from collections import namedtuple

Punto = namedtuple('Punto', ['x', 'y'])
Color = namedtuple('Color', ['rojo', 'verde', 'azul'])

p = Punto(3, 7)
print(p.x, p.y)   # 3 7
print(p[0], p[1]) # 3 7 — también funciona por índice

rojo_puro = Color(255, 0, 0)
print(rojo_puro.rojo)  # 255
print(rojo_puro)       # Color(rojo=255, verde=0, azul=0)

Cuándo usar tupla y cuándo lista

# Tupla: datos heterogéneos con significado fijo (fila de BD, coordenada)
empleado = ("García", "Ana", 42500.0, True)

# Lista: colección homogénea que puede cambiar
nombres_activos = ["Pedro", "María", "Luis"]

# Tupla en return: devolver varios valores
def minmax(nums):
    return min(nums), max(nums)  # devuelve tupla automáticamente

minimo, maximo = minmax([3, 1, 4, 1, 5, 9])
print(minimo, maximo)  # 1 9

La regla práctica: si los datos tienen estructura fija con significado semántico (coordenada, fecha, registro), usa tupla. Si la colección va a crecer, encogerse o reordenarse, usa lista.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP