La clase Counter de Python es parte del módulo de Collections. Counter es una subclase de Dictionary y se utiliza para realizar un seguimiento de los elementos y su conteo.
Python Counter
Counter es una colección desordenada donde los elementos se almacenan como claves de Dict
y su conteo como valor de dict. El conteo de los elementos de Counter puede ser de enteros positivos, cero o negativos. Sin embargo, no hay restricción en sus claves y valores. Aunque se supone que los valores son números, también podemos almacenar otros objetos.
Creación del objeto Counter de Python
Podemos crear un Counter vacío o comenzar con algunos valores iniciales también.
from collections import Counter
# Counter vacío
counter = Counter()
print(counter) # Counter()
# Counter con valores iniciales
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})
También podemos usar cualquier iterable como argumento para crear un objeto Counter. Por lo tanto, la literal de cadena y la Lista también se pueden usar para crear un 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})
# Diccionario 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 mencioné anteriormente, también podemos usar datos no numéricos para los valores de conteo, pero eso afectará el propósito de la clase Counter.
# Counter funciona con valores no numéricos
special_counter = Counter(name='Pankaj', age=20)
print(special_counter) # Counter({'name': 'Pankaj', 'age': 20})
Métodos de Counter en Python
Veamos los métodos de la clase Counter y algunas otras operaciones que podemos realizar con ella.
Obtener el Conteo de Elementos
# obteniendo conteo
counter = Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})
countDog = counter['Dog']
print(countDog) # 2
Si intentamos obtener el conteo de una clave que no existe, devolverá 0 y no lanzará un KeyError
.
# obteniendo conteo para una clave que no existe, no causa KeyError
print(counter['Unicorn']) # 0
Establecer el Conteo de Elementos
También podemos establecer el conteo de un elemento existente en el contador. Si el elemento no existe, se agrega al contador.
counter = Counter({'Dog': 2, 'Cat': 1, 'Horse': 1})
# estableciendo conteo
counter['Horse'] = 0
print(counter) # Counter({'Dog': 2, 'Cat': 1, 'Horse': 0})
# estableciendo conteo for non-existing key, adds to Counter
counter['Unicorn'] = 1
print(counter) # Counter({'Dog': 2, 'Cat': 1, 'Unicorn': 1, 'Horse': 0})
Eliminar un elemento de Counter
Podemos usar del
para eliminar un elemento del objeto contador.
# Eliminar elemento de Counter
del counter['Unicorn']
print(counter) # Counter({'Dog': 2, 'Cat': 1, 'Horse': 0})
elements()
Este método devuelve la lista de elementos en el contador. Solo se devuelven elementos con recuentos positivos.
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)
El código anterior imprimirá “Perro” dos veces porque su conteo es 2. Otros elementos serán ignorados porque no tienen un recuento positivo. Counter es una colección desordenada, por lo que los elementos se devuelven en un orden no particular.
most_common(n)
Este método devuelve los elementos más comunes del contador. Si no proporcionamos el valor de ‘n’, se devuelve un diccionario ordenado de los elementos más comunes a los menos comunes. Podemos usar el corte para obtener los elementos menos comunes en este diccionario 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() y update()
El método subtract()
de Counter se utiliza para restar recuentos de elementos de otro contador. El método update()
se utiliza para agregar recuentos de otro 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})
Operaciones Aritméticas de Contadores en Python
También podemos realizar algunas operaciones aritméticas en Contadores, al igual que con números. Sin embargo, solo se devuelven elementos con recuento positivo con estas operaciones.
# operaciones 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})
Operaciones Varias en Contadores de Python
Vamos a ver algunos fragmentos de código para operaciones diversas que podemos realizar en objetos Counter.
counter = Counter({'a': 3, 'b': 3, 'c': 0})
# ejemplos 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)])
# eliminar elementos con recuento 0 o negativo
counter = Counter(a=2, b=3, c=-1, d=0)
counter = +counter
print(counter) # Counter({'b': 3, 'a': 2})
# borrar todos los elementos
counter.clear()
print(counter) # Counter()
Eso es todo para la clase Counter de Python.
Puedes descargar el código de ejemplo completo desde mi Repositorio de GitHub.
Referencia: Documentación de Python
Source:
https://www.digitalocean.com/community/tutorials/python-counter-python-collections-counter