Dominando o collections.Counter no Python para Contagem de Objetos

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()

Tags: Python Collections Data Structures Counter

Publicado em 7-14 19:19