Counter - счетчик хешируемых объектов
Начиная с 3.7 - сабкласс dict
упорядоченый и поддерживает операции. связанные с порядком.
Инициализировать можно, передав последовательность для подсчета или словарь значение:количество или через присвоение аргументам. Одинаковые имена словаря естественно не поддерживаются :)
import collections
collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
collections.Counter({'a': 2, 'b': 3, 'c': 1})
collections.Counter(a=2, b=3, c=1)
Можно создать пустой каунтер и заполнить его позже методом update()
c = collections.Counter()
c.update('abcdaab')
c.update({'a': 1, 'd': 5})
При этом значения счетчиков будут увеличены в соответствии с переданными данными, а не заменены. Доступ к значениям счетчика можно получить по API словаря
c = collections.Counter({'a': 2, 'b': 3, 'c': 1})
print(c['a'])
>>> 2
При этом исключение KeyError
не поднимается, если такого ключа нет, а возвращается значение 0.
Счетчик можно установить непосредственно по API словаря. При этом установка значения в 0 не удаляет элемент из каунтера. Для удаления надо использорвать del
c['sausage'] = 0
del c['sausage']
Методы
elements()
возвращает итератор имен элементов в порядке добавления и в количестве, равном значению счетчика. Значения, равные 0 и меньше не возвращаются
c = Counter(a=4, e=2, c=0, d=-2, b=1)
list(c.elements())
>>> ['a', 'a', 'a', 'a', 'e', 'e', 'b']
most_common([n])
наиболее часто встречаемый элемент(-ы) - список кортежей (элемент, счетчик)
subtract([iterable-or-mapping])
разница с заменой
c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
priint(c.subtract(d))
>>> Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
Помимо этого доступны мат.операции, а так-же операции +=, -+, &=, | =. При этом создаются новые объекты, в которых элементы с нулевым или отрицательным значением счетчика отбрасываются |
c1 = collections.Counter(['a', 'b', 'c', 'a', 'b', 'b'])
c2 = collections.Counter('alphabet')
c1 + c2
c1 - c2
c1 & c2
c1 | c2
total()
позволяет посчитать сумму всех значений счетчика
Наиболее распространенные паттерны
c.total() # total of all counts
c.clear() # reset all counts
list(c) # list unique elements
set(c) # convert to a set
dict(c) # convert to a regular dictionary
c.items() # convert to a list of (elem, cnt) pairs
Counter(dict(list_of_pairs)) # convert from a list of (elem, cnt) pairs
c.most_common()[:-n-1:-1] # n least common elements
+c # remove zero and negative counts