Подсчёт частоты элементов в неупорядоченном списке
Быстрый ответ
Для подсчета частоты элементов в списке Python предлагает воспользоваться классом collections.Counter
:
from collections import Counter
частота = Counter(['яблоко', 'банан', 'яблоко', 'груша', 'банан', 'апельсин'])
print(частота)
# Вывод: Counter({'яблоко': 2, 'банан': 2, 'груша': 1, 'апельсин': 1})
Вы получите словарь, где для каждого элемента подсчитана частота его появления.
Детали и продвинутое использование Counter
Модификация счетчиков с помощью арифметических операций
Counter поддерживает арифметические операции, вроде +
и -
:
c1 = Counter(['яблоко', 'банан', 'яблоко'])
c2 = Counter(['банан', 'апельсин'])
c3 = c1 + c2 # Слияние счетчиков
print(c3)
# Вывод: Counter({'яблоко': 2, 'банан': 2, 'апельсин': 1})
Топ-(n) самых распространённых элементов
Метод most_common(n)
помогает получить n
самых часто встречающихся элементов:
print(частота.most_common(2))
# Вывод: [('яблоко', 2), ('банан', 2)]
# Похоже, в Кремниевой долине больше всего любят яблоки и бананы!
Извлечение уникальных элементов и их частоты
.keys()
предоставляет уникальные элементы, .values()
— соответствующие им частоты:
уникальные_элементы = частота.keys()
print(list(уникальные_элементы))
# Вывод: ['яблоко', 'банан', 'груша', 'апельсин']
список_частот = частота.values()
print(list(список_частот))
# Вывод: [2, 2, 1, 1]
Альтернативные способы подсчета частоты
Если Counter
по каким-то причинам недоступен, можно использовать defaultdict
или стандартные словари:
from collections import defaultdict
def подсчет_частоты(элементы):
частоты = defaultdict(int)
for элемент in элементы:
частоты[элемент] += 1
return частоты
print(подсчет_частоты(['яблоко', 'банан', 'яблоко']))
# Вывод: defaultdict(<class 'int'>, {'яблоко': 2, 'банан': 1})
В Python 2.7 и более новых версиях можно использовать компактное лямбда-выражение:
элементы = ['яблоко', 'банан', 'яблоко']
частота = {элемент: элементы.count(элемент) for элемент in set(элементы)}
print(частота)
# Вывод: {'яблоко': 2, 'банан': 1}
Визуализация
Пусть имеется скорбор фруктов-эмодзи:
Неупорядоченный список: [🍉, 🍇, 🍉, 🍌, 🍇, 🍌, 🍌]
Мы хотим подсчитать, сколько раз встречается каждый фрукт:
Подсчет фруктов:
- 🍉 (арбуз): 2
- 🍇 (виноград): 2
- 🍌 (банан): 3
Это можно сделать с помощью collections.Counter
в одну строку:
from collections import Counter
фруктовая_таблица = Counter(['🍉', '🍇', '🍉', '🍌', '🍇', '🍌', '🍌'])
Сгенерированная таблица выглядит так:
| Фрукт | Счет |
| ------ | ----- |
| 🍌 | 3 |
| 🍉 | 2 |
| 🍇 | 2 |
Здесь каждая цифра — это количество вхождений конкретного фрукта.
Отображение наиболее редких элементов
Для обнаружения наименее часто встречающихся элементов можно отсортировать .elements()
по возрастанию:
отсортированные_элементы = sorted(частота.elements())
print(отсортированные_элементы)
# Вывод: ['апельсин', 'груша', 'яблоко', 'яблоко', 'банан', 'банан']
Таким образом, апельсин
и груша
окажутся в начале списка.
Использование groupby для упорядоченных списков
Если список уже упорядочен, то удобнее использовать itertools.groupby
:
from itertools import groupby
отсортированный_список = sorted(['яблоко', 'банан', 'яблоко', 'банан', 'апельсин'])
группировка = {k: len(list(g)) for k, g in groupby(отсортированный_список)}
print(группировка)
# Вывод: {'яблоко': 2, 'банан': 2, 'апельсин': 1}
Частоты вместо элементов
Помните: каждая частота соответствует уникальному значению из исходного списка.
Полезные материалы
- Python 3.12.1 Documentation on collections — Контейнерные типы данных
- Использование словаря для подсчета элементов в списке на Stack Overflow
- Python Counter: Pythonic Way to Count Objects – Real Python
- Подсчет частот в списке с помощью словаря на GeeksforGeeks
- Как подсчитать количество повторений элемента в списке? на Stack Overflow
- Medium — Collections.Counter в Python