Itertools

En fase de pruebas Atividades: Esta sección está en validación y puede recibir ajustes.

itertools é um módulo da biblioteca padrão (não precisa instalar) com funções para iterar sobre dados de modo eficiente: combinar listas, gerar combinações e agrupar por chaves.

import itertools

Encadear listas com chain

Junta vários iteráveis sem criar uma lista intermediária na memória:

import itertools

paises_a = ["Brasil", "Argentina"]
paises_b = ["Chile", "Uruguai"]

todos = list(itertools.chain(paises_a, paises_b))
# ['Brasil', 'Argentina', 'Chile', 'Uruguai']

Repetir e ciclar

list(itertools.repeat("CPPS", 3))
# ['CPPS', 'CPPS', 'CPPS']

# 'cycle' é infinito — combine com 'islice' ou um break
ciclo = itertools.cycle(["A", "B", "C"])
[next(ciclo) for _ in range(5)]
# ['A', 'B', 'C', 'A', 'B']

Combinações e permutações

Úteis em análise combinatória ou para gerar pares para comparação:

paises = ["Brasil", "Argentina", "Uruguai"]

# Combinações de tamanho 2 (ordem não importa)
list(itertools.combinations(paises, 2))
# [('Brasil', 'Argentina'), ('Brasil', 'Uruguai'), ('Argentina', 'Uruguai')]

# Permutações de tamanho 2 (ordem importa)
list(itertools.permutations(paises, 2))
# [('Brasil', 'Argentina'), ('Brasil', 'Uruguai'),
#  ('Argentina', 'Brasil'), ('Argentina', 'Uruguai'), ...]

# Produto cartesiano
list(itertools.product([1, 2], ["a", "b"]))
# [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]

Agrupar por chave com groupby

Atenção: groupby agrupa elementos consecutivos com a mesma chave — não como o groupby de SQL ou Pandas. Ordene antes:

notas = [
    {"ano": 2020, "titulo": "NOTA 1"},
    {"ano": 2020, "titulo": "NOTA 2"},
    {"ano": 2021, "titulo": "NOTA 3"},
    {"ano": 2020, "titulo": "NOTA 4"},
]

notas.sort(key=lambda n: n["ano"])    # ordenar antes!

for ano, grupo in itertools.groupby(notas, key=lambda n: n["ano"]):
    titulos = [n["titulo"] for n in grupo]
    print(ano, titulos)
# 2020 ['NOTA 1', 'NOTA 2', 'NOTA 4']
# 2021 ['NOTA 3']

Fatiamento de iteradores

islice permite “fatiar” um gerador como uma lista, sem materializá-lo:

# 5 primeiros pares
list(itertools.islice((x for x in range(1000) if x % 2 == 0), 5))
# [0, 2, 4, 6, 8]

Quando usar

  • Quando você precisa percorrer muitos elementos e não quer carregar tudo em memória.
  • Quando precisa de combinações/permutações sem escrever loops aninhados.
  • Quando quer agrupar dados ordenados em uma única passagem.

Para a maioria das tarefas analíticas estruturadas, prefira Pandasgroupby do Pandas é mais simples e versátil. itertools brilha em scripts utilitários e em código que processa streams.

Referência rápida

FunçãoO que faz
chain(a, b, ...)Concatena iteráveis
repeat(x, n)Repete x n vezes
cycle(iter)Ciclo infinito
combinations(iter, r)Combinações sem repetição
permutations(iter, r)Permutações
product(*iters)Produto cartesiano
groupby(iter, key)Agrupa consecutivos pela chave
islice(iter, start, stop)Fatiamento
accumulate(iter)Soma cumulativa
count(start, step)Contador infinito