itertools
itertools proporciona bloques de construcción de iteradores rápidos y eficientes en memoria: encadenamiento, segmentación, combinatoria y agrupación sin listas intermedias.
Receta
from itertools import chain, islice, product
flat = chain([1, 2], [3, 4])
first_three = list(islice(range(10), 3))
pairs = list(product(["A", "B"], [1, 2]))Cuándo usar esto:
- Aplanar iterables anidados
- Paginación a través de
isliceen un contador infinito - Agrupar líneas de registro ordenadas por clave
- Productos cartesianos para la generación de casos de prueba
Ejemplo de Trabajo
from itertools import chain, groupby, islice, accumulate
def group_sorted(rows: list[tuple[str, int]]):
for key, group in groupby(rows, key=lambda r: r[0]):
yield key, sum(v for _, v in group)
def paginate(iterator, page_size: int):
page = 0
while True:
chunk = list(islice(iterator, page_size))
if not chunk:
break
yield page, chunk
page += 1
def running_totals(values):
return accumulate(values)
if __name__ == "__main__":
rows = [("a", 1), ("a", 2), ("b", 3)]
print(list(group_sorted(sorted(rows))))
print(list(paginate(iter(range(7)), 3)))
print(list(running_totals([1, 2, 3, 4])))Lo que esto demuestra:
groupbynecesita ordenar primero por la misma función de claveislicetoma de cualquier iterador sinlen()- Patrón
paginatepara APIs de streaming accumulateproduce reducciones en ejecución (suma por defecto)
Inmersión Profunda
Cómo Funciona
- Álgebra de iteradores - Las funciones consumen iterables, devuelven iteradores.
- groupby - Agrupa solo claves consecutivas iguales, no es
GROUP BYde SQL. - tee - Divide el iterador en iteradores independientes con almacenamiento en búfer.
- cycle/repeat/count - Iteradores infinitos; el bucle consumidor siempre está limitado.
- combinations/permutations - Generación combinatoria perezosa.
Usados Frecuentemente
| Función | Propósito |
|---|---|
chain | Concatenar iterables |
islice | Segmentar iterador |
groupby | Agrupación consecutiva |
product | Producto cartesiano |
zip_longest | Emparejar longitudes desiguales |
Notas de Python
from itertools import pairwise # 3.10+
for a, b in pairwise([1, 2, 3]):
print(a, b)Trampas
- groupby sin ordenar - Divide los grupos incorrectamente cuando las claves no son contiguas. Solución:
sorted(data, key=key)primero. - Memoria de tee - Almacena valores en búfer para iteradores secundarios. Solución: Usar con moderación en flujos grandes.
- Producto infinito -
product(count(), repeat=2)nunca termina. Solución: Limitar conislice. - chain.from_iterable - Aplana un nivel; la anidación más profunda requiere recursión o
chainanidado. - zip vs zip_longest -
zipse detiene en el más corto;zip_longestnecesitafillvaluepara el relleno.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
bucles for anidados | Dos iterables pequeños | Muchas combinaciones; itertools es más claro |
| comprensiones de lista | Materializar resultado pequeño | Producto cruzado grande |
groupby de pandas | Análisis de DataFrames | Tuplas de Python simples |
more-itertools | Recetas adicionales (chunked) | Restricción de solo stdlib |
Preguntas Frecuentes
¿Por qué ordenar antes de groupby?
groupby solo agrupa claves adyacentes iguales; ordenar agrupa las claves iguales juntas.
¿islice vs segmentar una lista?
islice funciona en iteradores sin acceso aleatorio ni len().
¿chain vs yield from?
chain para iterables conocidos a la vez; yield from para delegación de generador con protocolo.
¿Memoria de product?
Perezoso; genera tuplas bajo demanda. Materializar un producto enorme dispara la memoria.
¿Función personalizada de accumulate?
accumulate(values, func=operator.mul) para producto en ejecución, etc.
¿Disponibilidad de pairwise?
stdlib 3.10+; de lo contrario, el patrón zip(items, items[1:]).
¿starmap?
Como map pero desempaqueta argumentos de tuplas: starmap(pow, [(2,3), (3,2)]).
¿filterfalse?
Lo opuesto a filter; elementos donde pred es falso.
¿tee cuándo?
Necesita dos pasadas sobre el iterador sin almacenar todo; incurre en memoria de búfer.
¿combinations vs permutations?
combinations son subconjuntos insensibles al orden; permutations el orden importa.
Relacionado
- Generadores y yield - iteradores personalizados
- functools -
reducerelacionado conaccumulate - Comprensiones y Expresiones Generadoras -
genexp - Módulo collections -
Countercon iterables
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.