Contador Python – Coleções Python Counter

A classe Counter do Python faz parte do módulo Collections. Counter é uma subclasse de Dictionary e é usada para rastrear elementos e suas contagens.

Python Counter

Counter é uma coleção não ordenada onde os elementos são armazenados como chaves de Dict e suas contagens como valores do dicionário. A contagem dos elementos do Counter pode ser de números inteiros positivos, zero ou negativos. No entanto, não há restrição quanto às chaves e valores. Embora os valores sejam destinados a serem números, também podemos armazenar outros objetos.

Criando um Objeto Counter em Python

Podemos criar um Counter vazio ou começar com alguns valores iniciais também.

from collections import Counter

# Counter vazio
counter = Counter()
print(counter)  # Counter()

# Counter com valores iniciais
counter = Counter(['a', 'a', 'b'])
print(counter)  # Counter({'a': 2, 'b': 1})

counter = Counter(a=2, b=3, c=1)
print(counter)  # Counter({'b': 3, 'a': 2, 'c': 1})

Também podemos usar qualquer iterável como argumento para criar um objeto Counter. Assim, literal de string e List também podem ser usados para criar um objeto Counter.

# Iterable como argumento para Counter
counter = Counter('abc')
print(counter)  # Counter({'a': 1, 'b': 1, 'c': 1})

# Lista como argumento para Counter
words_list = ['Cat', 'Dog', 'Horse', 'Dog']
counter = Counter(words_list)
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})

# Dicionário como argumento para Counter
word_count_dict = {'Dog': 2, 'Cat': 1, 'Horse': 1}
counter = Counter(word_count_dict)
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})

Como mencionei acima, também podemos usar dados não numéricos para contagem, mas isso irá descaracterizar o propósito da classe Counter.

# Counter funciona com não números também
special_counter = Counter(name='Pankaj', age=20)
print(special_counter)  # Counter({'name': 'Pankaj', 'age': 20})

Métodos do Counter em Python

Vamos analisar os métodos da classe Counter e algumas outras operações que podemos realizar com ela.

Obtendo a contagem dos elementos

# obtendo a contagem
counter = Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})
countDog = counter['Dog']
print(countDog)  # 2

Se tentarmos obter a contagem de uma chave que não existe, ele retornará 0 e não lançará um KeyError.

# obtendo a contagem para uma chave que não existe, não causa KeyError
print(counter['Unicorn'])  # 0

Definindo a contagem dos elementos

Também podemos definir a contagem de um elemento existente no contador. Se o elemento não existir, ele será adicionado ao contador.

counter = Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})
# definindo a contagem
counter['Horse'] = 0
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 0})

# definindo a contagem for non-existing key, adds to Counter
counter['Unicorn'] = 1
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Unicorn': 1, 'Horse': 0})

Excluindo um elemento de um Contador

Podemos usar del para excluir um elemento do objeto contador.

# Excluir elemento do Contador
del counter['Unicorn']
print(counter)  # Counter({'Dog': 2, 'Cat': 1, 'Horse': 0})

elements()

Este método retorna a lista de elementos no contador. Apenas elementos com contagens positivas são retornados.

counter = Counter({'Dog': 2, 'Cat': -1, 'Horse': 0})

# elements()
elements = counter.elements()  # doesn't return elements with count 0 or less
for value in elements:
    print(value)

O código acima imprimirá “Cachorro” duas vezes porque sua contagem é 2. Outros elementos serão ignorados porque não têm contagem positiva. O Contador é uma coleção não ordenada, portanto, os elementos são retornados sem uma ordem específica.

most_common(n)

Este método retorna os elementos mais comuns do contador. Se não fornecermos o valor de ‘n’, então um dicionário ordenado é retornado dos elementos mais comuns aos menos comuns. Podemos usar fatiamento para obter os elementos menos comuns neste dicionário ordenado.

counter = Counter({'Dog': 2, 'Cat': -1, 'Horse': 0})

# most_common()
most_common_element = counter.most_common(1)
print(most_common_element)  # [('Dog', 2)]

least_common_element = counter.most_common()[:-2:-1]
print(least_common_element)  # [('Cat', -1)]

subtract() e update()

O método subtract() da classe Counter é usado para subtrair contagens de elementos de outro contador. O método update() é usado para adicionar contagens de outro contador.

counter = Counter('ababab')
print(counter)  # Counter({'a': 3, 'b': 3})
c = Counter('abc')
print(c)  # Counter({'a': 1, 'b': 1, 'c': 1})

# subtract
counter.subtract(c)
print(counter)  # Counter({'a': 2, 'b': 2, 'c': -1})

# update
counter.update(c)
print(counter)  # Counter({'a': 3, 'b': 3, 'c': 0})

Operações Aritméticas com o Counter do Python

Também podemos realizar algumas operações aritméticas em Contadores, assim como em números. No entanto, apenas os elementos com contagem positiva são retornados com essas operações.

# operações aritméticas
c1 = Counter(a=2, b=0, c=-1)
c2 = Counter(a=1, b=-1, c=2)

c = c1 + c2  # return items having +ve count only
print(c)  # Counter({'a': 3, 'c': 1})

c = c1 - c2  # keeps only +ve count elements
print(c)  # Counter({'a': 1, 'b': 1})

c = c1 & c2  # intersection min(c1[x], c2[x])
print(c)  # Counter({'a': 1})

c = c1 | c2  # union max(c1[x], c2[x])
print(c)  # Counter({'a': 2, 'c': 2})

Operações Diversas no Counter do Python

Vamos dar uma olhada em alguns trechos de código para operações diversas que podemos realizar em objetos Counter.

counter = Counter({'a': 3, 'b': 3, 'c': 0})
# exemplos diversos
print(sum(counter.values()))  # 6

print(list(counter))  # ['a', 'b', 'c']
print(set(counter))  # {'a', 'b', 'c'}
print(dict(counter))  # {'a': 3, 'b': 3, 'c': 0}
print(counter.items())  # dict_items([('a', 3), ('b', 3), ('c', 0)])

# remover elementos com contagem 0 ou negativa
counter = Counter(a=2, b=3, c=-1, d=0)
counter = +counter
print(counter)  # Counter({'b': 3, 'a': 2})

# limpar todos os elementos
counter.clear()
print(counter)  # Counter()

Isso é tudo para a classe Counter do Python.

Você pode baixar o código de exemplo completo do meu Repositório GitHub.

Referência: Documentação do Python

Source:
https://www.digitalocean.com/community/tutorials/python-counter-python-collections-counter