A clase Counter, integrada ao módulo collections do Python, é uma ferramenta extremamente eficiente projetada para contar elemantos em objetos iteráveis. Como uma subcalsse de dicionário (dict), ela mapeia elementos para suas respectivas frequências, facilitando operações de análise de dados e manipulação de sequências.
1. Inicialização e Contagem Básica
O Counter pode ser instanciado a partir de listas, strings, tuplas ou qualquer outro iterável. Ele gera um objeto onde as chaves são os itens e os valores são as contagens.
from collections import Counter
# Contagem em listas
frutas = ['maçã', 'banana', 'maçã', 'laranja', 'banana', 'maçã']
contador_frutas = Counter(frutas)
print(contador_frutas)
# Saída: Counter({'maçã': 3, 'banana': 2, 'laranja': 1})
# Contagem em strings
texto = "mississippi"
contador_letras = Counter(texto)
print(contador_letras)
# Saída: Counter({'i': 4, 's': 4, 'p': 2, 'm': 1})
Ao contrário de um dicionário comum, o Counter retorna zero em vez de um KeyError se você tentar acessar um elemento que não existe na coleção.
2. Identificando Elementos Mais Comuns
O método most_common(n) é uma das funcionalidades mais úteis, retornando uma lista das n entradas mais frequentes em ordem decrescente.
dados = [10, 20, 10, 30, 20, 10, 40, 50, 10]
analise = Counter(dados)
# Obter o elemento mais frequente
print(analise.most_common(1)) # Saída: [(10, 4)]
# Obter os dois elementos mais comuns
print(analise.most_common(2)) # Saída: [(10, 4), (20, 2)]
3. O Método elements() e Ordenação
O método elements() retorna um iterador sobre os elementos, repetindo cada um tantas vezes quanto for a sua contagem. É importante notar que elementos com contagem menor que um são ignorados.
c = Counter(a=2, b=3, c=0, d=-1)
print(list(c.elements()))
# Saída: ['a', 'a', 'b', 'b', 'b']
# Para listar chaves únicas em ordem alfabética
print(sorted(c.keys()))
# Saída: ['a', 'b', 'c', 'd']
4. Operações de Atualização e Exclusão
Você pode modificar as contagens dinamicamente usando os métodos update(), subtract() ou manipulação direta por chave.
estoque = Counter({'teclado': 5, 'mouse': 10})
# Adicionar novos elementos via iterável
estoque.update(['teclado', 'monitor'])
print(estoque['teclado']) # Saída: 6
# Remover elementos
del estoque['mouse']
print(estoque) # mouse foi removido
5. Aritmética e Operações de Conjunto
O Python permite realizar operações matemáticas entre objetos Counter. Existem duas formas de subtração que se comportam de maneira distinta:
- Operador Subtração (
-): Mantém apenas resultados positivos. - Método
subtract(): Realiza a operação in-place e permite contagens zero ou negativas.
c1 = Counter(a=3, b=1)
c2 = Counter(a=1, b=2)
# Adição
print(c1 + c2) # Counter({'a': 4, 'b': 3})
# Subtração (apenas positivos)
print(c1 - c2) # Counter({'a': 2})
# Método subtract (permite negativos)
c1.subtract(c2)
print(c1) # Counter({'a': 2, 'b': -1})
# Interseção (&) e União (|)
# A interseção pega o valor mínimo, a união pega o valor máximo
a = Counter(x=2, y=5)
b = Counter(x=4, y=1)
print(a & b) # Counter({'x': 2, 'y': 1})
print(a | b) # Counter({'x': 4, 'y': 5})
6. Resumo de Métodos Utilitários
Além das funções principais, é possível extrair informações estruturadas de forma similar a dicionários padrão.
amostra = Counter("aabbbc")
print(sum(amostra.values())) # Soma total de todas as contagens: 6
print(list(amostra.items())) # Lista de tuplas (elemento, contagem)
print(dict(amostra)) # Converte para um dicionário convencional
# Limpar o contador
amostra.clear()
print(amostra) # Counter()