Подсчёт частоты элементов в неупорядоченном списке

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подсчета частоты элементов в списке Python предлагает воспользоваться классом collections.Counter:

Python
Скопировать код
from collections import Counter
частота = Counter(['яблоко', 'банан', 'яблоко', 'груша', 'банан', 'апельсин'])
print(частота)
# Вывод: Counter({'яблоко': 2, 'банан': 2, 'груша': 1, 'апельсин': 1})

Вы получите словарь, где для каждого элемента подсчитана частота его появления.

Кинга Идем в IT: пошаговый план для смены профессии

Детали и продвинутое использование Counter

Модификация счетчиков с помощью арифметических операций

Counter поддерживает арифметические операции, вроде + и -:

Python
Скопировать код
c1 = Counter(['яблоко', 'банан', 'яблоко'])
c2 = Counter(['банан', 'апельсин'])
c3 = c1 + c2  # Слияние счетчиков
print(c3)
# Вывод: Counter({'яблоко': 2, 'банан': 2, 'апельсин': 1})

Топ-(n) самых распространённых элементов

Метод most_common(n) помогает получить n самых часто встречающихся элементов:

Python
Скопировать код
print(частота.most_common(2))
# Вывод: [('яблоко', 2), ('банан', 2)]
# Похоже, в Кремниевой долине больше всего любят яблоки и бананы!

Извлечение уникальных элементов и их частоты

.keys() предоставляет уникальные элементы, .values() — соответствующие им частоты:

Python
Скопировать код
уникальные_элементы = частота.keys()
print(list(уникальные_элементы))
# Вывод: ['яблоко', 'банан', 'груша', 'апельсин']

список_частот = частота.values()
print(list(список_частот))
# Вывод: [2, 2, 1, 1]

Альтернативные способы подсчета частоты

Если Counter по каким-то причинам недоступен, можно использовать defaultdict или стандартные словари:

Python
Скопировать код
from collections import defaultdict

def подсчет_частоты(элементы):
    частоты = defaultdict(int)
    for элемент in элементы:
        частоты[элемент] += 1
    return частоты

print(подсчет_частоты(['яблоко', 'банан', 'яблоко']))
# Вывод: defaultdict(<class 'int'>, {'яблоко': 2, 'банан': 1})

В Python 2.7 и более новых версиях можно использовать компактное лямбда-выражение:

Python
Скопировать код
элементы = ['яблоко', 'банан', 'яблоко']
частота = {элемент: элементы.count(элемент) for элемент in set(элементы)}
print(частота)
# Вывод: {'яблоко': 2, 'банан': 1}

Визуализация

Пусть имеется скорбор фруктов-эмодзи:

Markdown
Скопировать код
Неупорядоченный список: [🍉, 🍇, 🍉, 🍌, 🍇, 🍌, 🍌]

Мы хотим подсчитать, сколько раз встречается каждый фрукт:

plaintext
Скопировать код
Подсчет фруктов:
- 🍉 (арбуз): 2
- 🍇 (виноград): 2
- 🍌 (банан): 3

Это можно сделать с помощью collections.Counter в одну строку:

Python
Скопировать код
from collections import Counter
фруктовая_таблица = Counter(['🍉', '🍇', '🍉', '🍌', '🍇', '🍌', '🍌'])

Сгенерированная таблица выглядит так:

Markdown
Скопировать код
| Фрукт | Счет |
| ------ | ----- |
| 🍌    | 3   |
| 🍉    | 2   |
| 🍇    | 2   |

Здесь каждая цифра — это количество вхождений конкретного фрукта.

Отображение наиболее редких элементов

Для обнаружения наименее часто встречающихся элементов можно отсортировать .elements() по возрастанию:

Python
Скопировать код
отсортированные_элементы = sorted(частота.elements())
print(отсортированные_элементы)
# Вывод: ['апельсин', 'груша', 'яблоко', 'яблоко', 'банан', 'банан']

Таким образом, апельсин и груша окажутся в начале списка.

Использование groupby для упорядоченных списков

Если список уже упорядочен, то удобнее использовать itertools.groupby:

Python
Скопировать код
from itertools import groupby

отсортированный_список = sorted(['яблоко', 'банан', 'яблоко', 'банан', 'апельсин'])
группировка = {k: len(list(g)) for k, g in groupby(отсортированный_список)}
print(группировка)
# Вывод: {'яблоко': 2, 'банан': 2, 'апельсин': 1}

Частоты вместо элементов

Помните: каждая частота соответствует уникальному значению из исходного списка.

Полезные материалы

  1. Python 3.12.1 Documentation on collections — Контейнерные типы данных
  2. Использование словаря для подсчета элементов в списке на Stack Overflow
  3. Python Counter: Pythonic Way to Count Objects – Real Python
  4. Подсчет частот в списке с помощью словаря на GeeksforGeeks
  5. Как подсчитать количество повторений элемента в списке? на Stack Overflow
  6. Medium — Collections.Counter в Python