Kodokon kodokon.com

Estructuras avanzadas: tuplas, conjuntos y collections

Elige la estructura que se ajusta a cada necesidad: tuplas inmutables, conjuntos para pruebas de pertenencia en O(1), Counter y defaultdict para los patrones recurrentes.

9 min · 3 preguntas

Abrir esta lección en Kodokon

Elegir la estructura de datos adecuada resuelve de una sola vez la legibilidad y el rendimiento. La tupla es una secuencia inmutable: ideal para un registro heterogéneo de tamaño fijo (coordenadas, un par clave-valor). Inmutable implica hashable (si su contenido lo es): una tupla puede por tanto servir de clave de diccionario o de elemento de un conjunto, cosa que una lista no puede. El desempaquetado hace que el código sea expresivo - y una función que "devuelve varios valores" en realidad devuelve una tupla.

PYTHON
point = (48.85, 2.35)
lat, lon = point

def min_max(values):
    return min(values), max(values)

low, high = min_max([3, 1, 4, 1, 5])
print(low, high)

distances = {("paris", "lyon"): 465}
print(distances[("paris", "lyon")])
Desempaquetado, retorno múltiple y una tupla como clave de diccionario

El conjunto garantiza la unicidad y ofrece una prueba de pertenencia en O(1) en promedio, donde una lista es O(n). En un bucle que comprueba x in collection miles de veces, la diferencia se nota de inmediato. Los operadores de conjuntos (& intersección, - diferencia, | unión) son una auténtica mejora frente a los bucles anidados: comparar dos listas de identificadores - quién ha desaparecido, quién es nuevo - cabe en dos líneas.

PYTHON
active = {"ada", "linus", "guido"}
banned = {"linus", "mallory"}

print(active & banned)
print(active - banned)
print(active | banned)

emails = ["a@x.io", "b@x.io", "a@x.io"]
unique = set(emails)
print(len(unique))
Operaciones de conjuntos y eliminación de duplicados

El módulo collections cubre dos necesidades cotidianas. Counter cuenta las apariciones en un iterable y expone most_common(n) - se acabaron los diccionarios de conteo escritos a mano. defaultdict(factory) construye sobre la marcha el valor que falta: defaultdict(list) es la herramienta canónica para agrupar elementos por clave sin comprobar la existencia de la clave en cada vuelta del bucle.

PYTHON
from collections import Counter, defaultdict

words = ["go", "py", "go", "rs", "go"]
counts = Counter(words)
print(counts.most_common(2))

groups = defaultdict(list)
pairs = [("fr", "Ada"), ("us", "Lin"), ("fr", "Zoe")]
for country, name in pairs:
    groups[country].append(name)
print(dict(groups))
Counter para contar, defaultdict para agrupar

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Por qué una tupla puede servir de clave de diccionario, a diferencia de una lista?
    • Se crea más rápido
    • Es inmutable, por tanto hashable
    • Solo puede contener números
    • Los diccionarios convierten las listas en tuplas
  2. Pruebas x in collection miles de veces sobre 100.000 elementos. ¿Qué estructura deberías elegir?
    • Una lista, recorrida secuencialmente
    • Un conjunto, pertenencia en O(1) en promedio
    • Una tupla, más compacta que una lista
  3. Con groups = defaultdict(list), ¿qué hace leer una clave ausente?
    • Lanza un KeyError
    • Devuelve una lista vacía e inserta la clave
    • Devuelve None sin modificar el diccionario