Inicio > Cursos > Python > Itertools y Programación Funcional
PythonFunciones AvanzadasLección 9 de 24

Itertools y Programación Funcional

itertools es un módulo de Python con herramientas para recorrer y combinar listas sin cargar todo en memoria. Se usa con import itertools. Un iterable es cualquier cosa que puedes recorrer con for (lista, texto, range).

• chain(a, b) → junta varios iterables en uno. list(chain([1, 2], [3])) da [1, 2, 3] • combinations(lista, 2) → todos los pares sin repetir y sin importar el orden. combinations("ABC", 2) da AB, AC, BC • islice(it, 3) → toma solo los primeros 3. list(islice(range(100), 3)) da [0, 1, 2] • groupby(lista, key=f) → agrupa elementos consecutivos que tienen la misma clave. Antes hay que ordenar la lista por esa clave.

import itertools

# chain - concatenar iterables
letras = itertools.chain("ABC", "DEF")
print(list(letras))  # ['A','B','C','D','E','F']

numeros = list(itertools.chain([1,2], [3,4], [5,6]))
print(numeros)  # [1, 2, 3, 4, 5, 6]

# product - producto cartesiano
colores = ["rojo", "azul"]
tallas = ["S", "M", "L"]
variantes = list(itertools.product(colores, tallas))
# [('rojo','S'),('rojo','M'),('rojo','L'),('azul','S')...]

# combinations y permutations
equipo = ["Ana", "Bob", "Carlos", "Diana"]
pares = list(itertools.combinations(equipo, 2))
print(f"{len(pares)} pares posibles")  # 6

perms = list(itertools.permutations(["A","B","C"]))
print(f"{len(perms)} permutaciones")  # 6

# groupby - agrupar elementos consecutivos iguales
ventas = [
    {"mes": "Ene", "vendedor": "Ana", "monto": 1000},
    {"mes": "Ene", "vendedor": "Bob", "monto": 800},
    {"mes": "Feb", "vendedor": "Ana", "monto": 1200},
    {"mes": "Feb", "vendedor": "Bob", "monto": 900},
]
# Requiere ordenar antes de groupby
ventas.sort(key=lambda v: v["mes"])
for mes, grupo in itertools.groupby(ventas, key=lambda v: v["mes"]):
    total = sum(v["monto"] for v in grupo)
    print(f"{mes}: ${total}")

# takewhile y dropwhile
nums = [1, 3, 5, 2, 4, 6, 7]
menores = list(itertools.takewhile(lambda x: x < 4, nums))
# [1, 3] - para cuando encuentra 2 que no cumple

# islice - slice de iterables infinitos
primeros_10 = list(itertools.islice(itertools.count(1), 10))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Consejo🔗 itertools.chain(*listas) es la forma eficiente de "aplanar" una lista de listas sin crear copia completa en memoria.
← Comprehensions y FunctoolsDecoradores y Generadores →

Practica esta lección

Resuelve los ejercicios del curso de Python en la app, gratis y con corrección automática.

Empezar a practicar