Recapitulação de collections, itertools & functools
Três módulos da biblioteca padrão formam o toolkit de dados do Python: collections (contêineres especializados), itertools (álgebra de iteradores), functools (funções de ordem superior). Domine um pequeno subconjunto antes de procurar no PyPI.
Receita
from collections import Counter, defaultdict
from functools import lru_cache
from itertools import islice, chain
@lru_cache(maxsize=128)
def fib(n: int) -> int:
return n if n < 2 else fib(n - 1) + fib(n - 2)
counts = Counter(chain.from_iterable(["a", "b", "a"]))Quando usar:
- Contagem de frequências -> Counter
- Agrupamento -> defaultdict, itertools.groupby
- Memoização -> lru_cache
- Streaming de grandes volumes de dados -> itertools chain/islice
- Despacho de função única (single-dispatch) -> functools.singledispatch
Exemplo de Trabalho
from collections import Counter, deque
from functools import partial
from itertools import groupby
def top_n(words: list[str], n: int = 3) -> list[tuple[str, int]]:
return Counter(words).most_common(n)
def sliding_window(iterable, size: int):
window = deque(maxlen=size)
for item in iterable:
window.append(item)
if len(window) == size:
yield tuple(window)
def group_sorted(rows: list[tuple[str, int]]):
for key, group in groupby(sorted(rows), key=lambda r: r[0]):
yield key, list(group)
words = ["api", "api", "cli", "ui", "api"]
print(top_n(words))
print(list(sliding_window(range(6), 3)))
print(list(group_sorted([("a", 1), ("a", 2), ("b", 3)])))
double = partial(pow, 2)
print(double(5))O que isso demonstra:
- Counter para contagens sem incrementos manuais de dicionário
- deque com maxlen para janelas deslizantes O(1)
- groupby requer entrada ordenada para agrupar todas as chaves
- partial fixa os argumentos mais à esquerda da chamada
Mergulho Profundo
Destaques de collections
| Tipo | Uso |
|---|---|
| deque | Extremidades FIFO/LRU |
| Counter | Contagens de multiconjuntos |
| defaultdict | Chaves ausentes com valor padrão |
| namedtuple | Registros leves (dataclass é frequentemente melhor) |
Destaques de itertools
chain,islice,batched(3.12+)product,permutationscombinatória- Lazy (preguiçoso) - amigável à memória
Destaques de functools
lru_cache,cache(3.9+ sem limite)singledispatch,wrapspara decoradores
Armadilhas
- groupby com entrada não ordenada - divide a mesma chave duas vezes. Correção: ordene primeiro ou use defaultdict.
- Argumentos mutáveis em lru_cache - parâmetros de dicionário/lista não "hashable" falham. Correção: use chaves tupla ou desative o cache.
- itertools infinitos sem islice - loops infinitos. Correção: limite o consumo.
- Contagens negativas em Counter - permitidas, mas confusas. Correção: use apenas caminhos de incremento.
- Uso prematuro de more-itertools -
batched/isliceda biblioteca padrão cobrem muitos casos em 3.12+.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| dataclasses | Registros estruturados | Contagens puras |
| pandas | Estatísticas colunares | Pequenas contagens em memória |
| more-itertools | Receitas extras | Política de usar apenas a biblioteca padrão |
FAQs
Counter most_common?
Heap eficiente para as top-k frequências.
deque vs fila de lista?
deque tem pop O(1) da esquerda; list pop(0) é O(n).
cache vs lru_cache?
cache não tem limite - apenas para espaço de argumento finito e pequeno.
itertools.batched?
A partir do 3.12, divide um iterável em tuplas de tamanho n - substitui loops zip manuais.
namedtuple ainda?
Tuplas imutáveis leves - dataclasses são frequentemente mais claras para código novo.
reduce?
Disponível, mas loops explícitos são muitas vezes mais legíveis em Python.
chain.from_iterable?
Achata uma lista de listas sem cópia.
singledispatchmodule?
Veja a página de padrões "pythonic" para despacho baseado em tipo.
Desempenho?
itertools é lazy; Counter é implementado em C - rápido para tamanhos típicos.
Onde encontrar cobertura mais aprofundada?
Veja as seções de estruturas de dados e iteradores-geradores para tratamento estendido.
Relacionados
- dataclasses, enum & contextlib - registros
- The Strategy & Dispatch Patterns - singledispatch
- Standard Library Overview - mapa
- Standard Library Best Practices - regras do toolkit
Versões da 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+.