itertools
itertools fornece blocos de construção de iteradores rápidos e eficientes em memória - encadeamento, fatiamento, combinatória e agrupamento sem listas intermediárias.
Receita
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]))Quando usar:
- Achatar iteráveis aninhados
- Paginação via
isliceem um contador infinito - Agrupar linhas de log ordenadas por chave
- Produtos cartesianos para geração de casos de teste
Exemplo de Trabalho
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])))O que isso demonstra:
groupbyprecisa ser ordenado pela mesma função de chave primeiroislicepega de qualquer iterador semlen()- Padrão
paginatepara APIs de streaming accumulateproduz reduções correntes (soma padrão)
Mergulho Profundo
Como Funciona
- Álgebra de iteradores - Funções consomem iteráveis, retornam iteradores.
- groupby - Agrupa apenas chaves consecutivas iguais - não é SQL GROUP BY.
- tee - Divide o iterador em iteradores independentes com armazenamento em buffer.
- cycle/repeat/count - Iteradores infinitos - sempre limite o loop do consumidor.
- combinations/permutations - Geração combinatória preguiçosa.
Frequentemente Usado
| Função | Propósito |
|---|---|
chain | Concatenar iteráveis |
islice | Fatiar iterador |
groupby | Agrupamento consecutivo |
product | Produto cartesiano |
zip_longest | Empacotar comprimentos desiguais |
Notas do Python
from itertools import pairwise # 3.10+
for a, b in pairwise([1, 2, 3]):
print(a, b)Armadilhas
- groupby sem sort - Divide grupos incorretamente quando as chaves não são contíguas. Correção:
sorted(data, key=key)primeiro. - tee memory - Armazena valores em buffer para iteradores secundários. Correção: Use com moderação em fluxos grandes.
- produto infinito -
product(count(), repeat=2)nunca termina. Correção: Limite comislice. - chain.from_iterable - Achata um nível - aninhamento mais profundo requer recursão ou
chainaninhado. - zip vs zip_longest -
zippara no mais curto;zip_longestprecisa defillvaluepara preenchimento.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| loops for aninhados | Dois iteráveis pequenos | Muitas combinações - itertools é mais claro |
| compreensões de lista | Materializar resultado pequeno | Grande produto cruzado |
| pandas groupby | Análise de DataFrame | Tuplas Python simples |
| more-itertools | Receitas extras (chunked) | Restrição de apenas biblioteca padrão |
FAQs
Por que ordenar antes do groupby?
groupby apenas agrupa chaves iguais adjacentes - a ordenação agrupa chaves iguais juntas.
islice vs fatiar lista?
islice funciona em iteradores sem acesso aleatório ou len().
chain vs yield from?
chain para iteráveis conhecidos de uma vez; yield from para delegação de gerador com protocolo.
Memória do product?
Preguiçoso - gera tuplas sob demanda. Materializar um produto enorme explode a memória.
função customizada do accumulate?
accumulate(values, func=operator.mul) para produto corrente, etc.
disponibilidade do pairwise?
stdlib 3.10+ - senão o padrão zip(items, items[1:]).
starmap?
Como map, mas desempacota argumentos de tupla - starmap(pow, [(2,3), (3,2)]).
filterfalse?
O oposto de filter - elementos onde o predicado é falso.
tee quando?
Precisa de duas passagens sobre o iterador sem armazenar tudo - paga memória de buffer.
combinations vs permutations?
combinations são subconjuntos insensíveis à ordem; permutations a ordem importa.
Relacionado
- Geradores e yield - iteradores customizados
- functools -
reducerelacionado aaccumulate - Compreensões e Expressões Geradoras -
genexp - Módulo collections -
Countercom iteráveis
Versões do Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 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+, e uv 0.6+.