Lecciones del módulo (4/4)
itertools esenciales
Python expone muchas herramientas de iteración: algunas son nativas (siempre disponibles),
otras viven en el módulo itertools de la biblioteca estándar.
Aquí están las más importantes.
enumerate: índice + valor
Cuando necesitas tanto el índice como el elemento durante un bucle:
for i, parola in enumerate(["a", "b", "c"]):
print(i, parola)
# 0 a
# 1 b
# 2 c
# comenzar desde otro número:
for i, parola in enumerate(["a", "b", "c"], start=1):
print(i, parola)zip: iterar en paralelo
Combina múltiples iterables elemento por elemento:
nomi = ["Ada", "Linus", "Grace"]
eta = [36, 54, 85]
for n, e in zip(nomi, eta):
print(f"{n} ha {e} anni")zip se detiene en el iterable más corto. Para un zip "largo" usa
itertools.zip_longest.
Construir un diccionario a partir de dos listas paralelas:
dict(zip(nomi, eta))
# {'Ada': 36, 'Linus': 54, 'Grace': 85}itertools.chain: concatenar iterables
from itertools import chain
list(chain([1, 2], [3, 4], [5]))
# [1, 2, 3, 4, 5]Sin crear una lista intermedia: útil para archivos, generadores, etc.
itertools.count y repeat: iteradores infinitos
from itertools import count, repeat
# count(start, step) — enteros infinitos crecientes
for i in count(10, 2):
if i > 20: break
print(i)
# 10, 12, 14, 16, 18, 20
# repeat(x, n) — repete el mismo valor n veces (o infinitamente sin n)
list(repeat("ok", 3)) # ['ok', 'ok', 'ok']itertools.combinations
Todas las combinaciones (sin repeticiones, independientes del orden) de una longitud dada:
from itertools import combinations
list(combinations([1, 2, 3, 4], 2))
# [(1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]Variante ordenada: permutations. Variantes con repetición:
combinations_with_replacement y product.
zip() para diccionarios e iterables no balanceados
La función zip() se detiene tan pronto como se agota el iterable de entrada más corto. Si deseas emparejar elementos y conservar cualquier valor excedente (rellenándolos con un valor predeterminado como None), puedes usar zip_longest() del módulo itertools. Además, puedes pasar el resultado de un zip directamente a dict() para construir instantáneamente un mapa clave-valor.
Pruébalo tú
Dadas las listas paralelas `countries = ['Italia', 'Francia', 'Spagna']` y `capitals = ['Roma', 'Parigi', 'Madrid']`, construye `mapping` como un diccionario {country: capital}. Evalúa `mapping`.
Mostrar pista
dict(zip(countries, capitals))
Solución disponible después de 3 intentos
Ejercicio de repaso
Dada la lista `words = ['ciao', 'mondo', 'python']`, construye `enumerated_items` como una lista de tuplas (i, word) comenzando desde i=1. Evalúa `enumerated_items`.
Mostrar pista
enumerate(words, start=1) → tuplas (i, valor).
Solución disponible después de 3 intentos
Desafío adicional
Dadas dos listas `keys = ['a', 'b', 'c']` y `values = [10, 20, 30]`, usa `zip` para emparejarlas y convierte el resultado en un diccionario. Guarda el diccionario resultante en `my_dict` y evalúalo.
Mostrar pista
Usa dict(zip(keys, values)) y asígnalo a my_dict.
Solución disponible después de 3 intentos