O módulo collections em Python é uma biblioteca embutida que oferece alternativas avançadas aos contêineres padrão, como dicionários, listas, conjuntos e tuplas. Ele fornece estruturas de dados especializadas para tarefas comuns, facilitando o desenvolvimento com funcionalidades adicionais.
import collections
print(dir(collections))
# Saída: ['ChainMap', 'Counter', 'OrderedDict', 'defaultdict', 'deque', 'namedtuple', ...]
A seguir, exploramos os componentes mais utilizados deste módulo.
2. Componentes Principais
- namedtuple(): Cria tuplas com campos nomeados, melhorando a legibilidade.
- deque: Lista duplamente encadeada para operações rápidas nas extremidades.
- defaultdict: Dicionário com valores padrão para chaves ausantes.
- OrderedDict: Dicionário que mantém a ordem de inserção (mais relevante antes do Python 3.7).
- Counter: Ferramenta para contar elementos em iteráveis.
namedtuple() - Tuplas Nomeadas
Parâmetros:
collections.namedtuple(nome_tipo, nomes_campos, *, renomear=False, padroes=None, modulo=None)
- nome_tipo: Nome da nova classe de tupla.
- nomes_campos: Sequência de strings para os campos.
- renomear: Se True, corrige nomes de campos inválidos automaticamente.
- padroes: Valores padrão para os campos (Python 3.7+).
- modulo: Define o atributo
__module__(Python 3.6+).
Exemplo de Uso: Definindo uma tupla para representar um produto.
from collections import namedtuple
Produto = namedtuple('Produto', ['nome', 'preco'])
item1 = Produto('Laptop', 1500)
item2 = Produto('Mouse', 50)
print(item1) # Produto(nome='Laptop', preco=1500)
print(item2) # Produto(nome='Mouse', preco=50)
# Verificando o tipo
print(isinstance(item1, Produto)) # True
print(isinstance(item1, tuple)) # True
# Usando _make para criar a partir de uma lista
dados = ['Teclado', 200]
item3 = Produto._make(dados)
print(item3) # Produto(nome='Teclado', preco=200)
# Usando _replace para modificar um campo
item1 = item1._replace(preco=1400)
print(item1) # Produto(nome='Laptop', preco=1400)
deque - Fila Duplamente Encadeada
Parâmetros:
collections.deque([iteravel[, maxlen]])
- iteravel: Dados iniciais (opcional).
- maxlen: Comprimento máximo (opcional); se definido, descarta itens da extremidade oposta ao adicionar novos.
Exemplo de Uso:
from collections import deque
fila = deque([10, 20, 30], maxlen=5)
fila.append(40)
print(fila) # deque([10, 20, 30, 40], maxlen=5)
print(fila.popleft()) # 10
print(fila) # deque([20, 30, 40], maxlen=5)
fila.extend([50, 60])
print(fila) # deque([20, 30, 40, 50, 60], maxlen=5)
print(fila.index(40)) # 2
fila.remove(50)
print(fila) # deque([20, 30, 40, 60], maxlen=5)
fila.reverse()
print(fila) # deque([60, 40, 30, 20], maxlen=5)
print(fila.maxlen) # 5
Métodos adicionais incluem appendleft, pop, insert, rotate, entre outros, para manipulação eficiente.
defaultdict - Dicionário com Valor Padrão
Quando uma chave não existe, retorna um valor padrão definido por uma fábrica.
Exemplo de Uso: Contagem de palavras.
from collections import defaultdict
contagem = defaultdict(int)
palavras = ['maçã', 'banana', 'maçã', 'laranja', 'banana', 'banana']
for palavra in palavras:
contagem[palavra] += 1
print(contagem) # defaultdict(<class>, {'maçã': 2, 'banana': 3, 'laranja': 1})
</class>
Outro uso com list para agrupamento:
agrupamento = defaultdict(list)
pares = [('cor', 'azul'), ('tamanho', 'M'), ('cor', 'vermelho'), ('tamanho', 'G')]
for chave, valor in pares:
agrupamento[chave].append(valor)
print(agrupamento) # defaultdict(<class>, {'cor': ['azul', 'vermelho'], 'tamanho': ['M', 'G']})
</class>
Isso simplifica operações que normalmante exigiriam verificações manuais de chaves.
OrderedDict - Dicionário Ordenado
Mantém a ordem de inserção dos itens. No Python 3.7+, os dicionários paddrão também preservam a ordem, mas OrderedDict oferece métodos adicionais.
Exemplo de Uso:
from collections import OrderedDict
dados = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])
print(dados)
# Remover itens em ordem específica
print(dados.popitem(last=True)) # ('d', 4)
print(dados.popitem(last=False)) # ('a', 1)
print(dados) # OrderedDict([('b', 2), ('c', 3)])
# Mover uma chave para o início ou fim
dados.move_to_end('c', last=False)
print(dados) # OrderedDict([('c', 3), ('b', 2)])
Counter - Contador de Elementos
Subclasse de dict otimizada para contar elementos hashable.
Exemplo de Uso:
from collections import Counter
texto = 'programar em python é divertido'
contagem_texto = Counter(texto)
print(contagem_texto) # Counter({'r': 4, 'a': 3, 'e': 3, ...})
lista_cores = ['azul', 'vermelho', 'azul', 'verde', 'azul', 'vermelho']
contagem_cores = Counter(lista_cores)
print(contagem_cores) # Counter({'azul': 3, 'vermelho': 2, 'verde': 1})
# Método most_common para elementos frequentes
print(contagem_cores.most_common(2)) # [('azul', 3), ('vermelho', 2)]
# Método elements para iterar sobre elementos repetidos
c = Counter(x=3, y=2, z=0)
print(list(c.elements())) # ['x', 'x', 'x', 'y', 'y']
# Método subtract para subtrair contagens
c1 = Counter(a=5, b=3)
c2 = Counter(a=2, b=4)
c1.subtract(c2)
print(c1) # Counter({'a': 3, 'b': -1})