Counter в collections Python: эффективное подсчёт, обновление и арифметические операции
Что такое Counter в Python?
Counter в Python — это специализированный контейнер, подсчитывающий вхождения каждого элемента в итерируемом объекте. Он наследуется от dict и хранит элементы как ключи с их счётчиками как значениями, что делает его идеальным инструментом для хеш-табличного подсчёта.
Зачем использовать Counter?
- Хранит данные в неупорядоченной, хеш-табличной структуре с элементами как ключами и их счётчиками как значениями.
- Подсчёт элементов в любом итерируемом объекте — строках, списках, кортежах или словарях — прост.
- Встроенные арифметические операции (сложение, вычитание, пересечение, объединение) позволяют мощные манипуляции, похожие на множества.
- Может агрегировать счётчики из других экземпляров
Counterбесшовно.
Начало работы с Counter
Импортируйте класс из collections:
from collections import Counter
Теперь можно передать любой итерируемый объект в Counter и получить отображение счётчиков.
Пример — подсчёт списка
list1 = ['x','y','z','x','x','x','y','z'] print(Counter(list1))
Вывод:
Counter({'x': 4, 'y': 2, 'z': 2})
Пример — подсчёт строки
my_str = "Welcome to Guru99 Tutorials!" print(Counter(my_str))
Вывод:
Counter({'o': 3, ' ': 3, 'u': 3, 'e': 2, 'l': 2, 't': 2, 'r': 2, '9': 2, 'W': 1, 'c': 1, 'm': 1, 'G': 1, 'T': 1, 'i': 1, 'a': 1, 's': 1, '!': 1})
Пример — подсчёт словаря
dict1 = {'x': 4, 'y': 2, 'z': 2}
print(Counter(dict1))
Вывод:
Counter({'x': 4, 'y': 2, 'z': 2})
Пример — подсчёт кортежа
tuple1 = ('x','y','z','x','x','x','y','z')
print(Counter(tuple1))
Вывод:
Counter({'x': 4, 'y': 2, 'z': 2})
Инициализация, обновление и доступ к счётчикам
Инициализация
print(Counter("Welcome to Guru99 Tutorials!")) # строка
print(Counter(['x','y','z','x','x','x','y','z'])) # список
print(Counter({'x': 4, 'y': 2, 'z': 2})) # словарь
print(Counter(('x','y','z','x','x','x','y','z'))) # кортеж
# Пустой счётчик
_count = Counter()
Обновление
_count.update('Welcome to Guru99 Tutorials!')
print(_count)
Вывод:
Counter({'o': 3, ' ': 3, 'u': 3, 'e': 2, 'l': 2, 't': 2, 'r': 2, '9': 2, 'W': 1, 'c': 1, 'm': 1, 'G': 1, 'T': 1, 'i': 1, 'a': 1, 's': 1, '!': 1})
Доступ к счётчикам
print('%s : %d' % ('u', _count['u']))
for char in 'Guru':
print('%s : %d' % (char, _count[char]))
Вывод:
u : 3 G : 1 u : 3 r : 2 u : 3
Удаление элемента
del _count['x'] print(_count)
Вывод:
Counter({'y': 2, 'z': 2})
Арифметические операции
Counter поддерживает множественные арифметические операции. Положительные счётчики сохраняются; отрицательные значения отбрасываются в результате.
counter1 = Counter({'x': 4, 'y': 2, 'z': -2})
counter2 = Counter({'x1': -12, 'y': 5, 'z': 4})
# Сложение
print(counter1 + counter2)
# Вычитание
print(counter1 - counter2)
# Пересечение
print(counter1 & counter2)
# Объединение
print(counter1 | counter2)
Вывод:
Counter({'y': 7, 'x': 4, 'z': 2})
Counter({'x1': 12, 'x': 4})
Counter({'y': 2})
Counter({'y': 5, 'x': 4, 'z': 4})
Ключевые методы
- elements() — возвращает итератор по элементам с положительными счётчиками.
- most_common([n]) — возвращает n самых частых элементов как список кортежей (elem, count).
- subtract(other) — вычитает счётчики из другого Counter.
- update(other) — добавляет счётчики из другого Counter.
Использование elements()
counter = Counter({'x': 5, 'y': 2, 'z': -2, 'x1': 0})
for e in counter.elements():
print(e)
Вывод:
x x x x x y y
Использование most_common()
counter = Counter({'x': 5, 'y': 12, 'z': -2, 'x1': 0})
print(counter.most_common(2))
print(counter.most_common())
Вывод:
[('y', 12), ('x', 5)]
[('y', 12), ('x', 5), ('x1', 0), ('z', -2)]
Использование subtract()
c1 = Counter({'x': 5, 'y': 12, 'z': -2, 'x1': 0})
c2 = Counter({'x': 2, 'y': 5})
c1.subtract(c2)
print(c1)
Вывод:
Counter({'y': 7, 'x': 3, 'x1': 0, 'z': -2})
Использование update()
c1 = Counter({'x': 5, 'y': 12, 'z': -2, 'x1': 0})
c2 = Counter({'x': 2, 'y': 5})
c1.update(c2)
print(c1)
Вывод:
Counter({'y': 17, 'x': 7, 'x1': 0, 'z': -2})
Переназначение счётчиков
counter = Counter({'x': 5, 'y': 12, 'z': -2, 'x1': 0})
counter['y'] = 20
print(counter)
Вывод:
Counter({'y': 20, 'x': 5, 'x1': 0, 'z': -2})
Получение и установка счётчиков элементов
counter = Counter({'x': 5, 'y': 12, 'z': -2, 'x1': 0})
print(counter['y'])
counter['y'] = 20
counter['y1'] = 10
print(counter)
Вывод:
12
Counter({'y': 20, 'y1': 10, 'x': 5, 'x1': 0, 'z': -2})
Резюме
- Counter — подкласс словаря, подсчитывающий элементы в любом итерируемом объекте.
- Поддерживает эффективный подсчёт, арифметические операции и набор служебных методов.
- Типичные сценарии: частотный анализ, генерация гистограмм, агрегация данных.
- Для полной документации см. документацию Python Counter.
Python
- Мастерство метода strip() в Python: подробное руководство и практические примеры
- Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами
- Мастерство строк форматирования format() в Python: понятные примеры
- Python len(): практическое руководство по измерению длины объектов
- Мастерство метода String.find() в Python: синтаксис, примеры и альтернативы
- Освоение лямбда-функций Python: практические примеры и лучшие практики
- Функция round() в Python: подробное объяснение с практическими примерами
- Освоение функции map() в Python: синтаксис, примеры и лучшие практики
- Python timeit(): измерение времени выполнения с практическими примерами
- Python list.count(): экспертное руководство с практическими примерами