Как подсчитать вхождения в списке в Python

Узнайте, как лучше всего подсчитывать вхождения элементов в список Python. Сравните метод count(), Collections.Counter и подсчет словаря.

Попробуйте это решение в редакторе

Обзор

Анализ наборов данных часто требует подсчета вхождений отдельных элементов. Например, подсчет количества голосов, полученных каждым кандидатом, подсчет частоты слов в текстовых файлах или выявление дубликатов в журналах транзакций. Python предоставляет несколько инструментов для решения этой проблемы, в зависимости от того, ищете ли вы отдельный счетчик элементов или полный подсчет частоты.

Для проверки частоты одного конкретного элемента встроенный тип списка предоставляет метод `.count(value)`. Он перебирает список и возвращает целое число, подсчитывающее, сколько раз появляется это точное значение. Несмотря на простоту и читабельность, вызов .count() в цикле для получения счетчиков для всех элементов крайне неэффективен, поскольку работает со сложностью O(N^2).

Для подсчета частот всех элементов одновременно за один проход стандартная библиотека предлагает класс «Счетчик» в модуле «коллекции». Передача списка в Counter возвращает объект, похожий на словарь, представляющий частоты всех элементов за время O(N). Он также предоставляет вспомогательные методы, такие как «most_common()», для быстрого извлечения самых популярных элементов.

Код и вывод выполнения

Этот код демонстрирует подсчет отдельных элементов в списках и получение общего количества элементов с помощью Collections.Counter.

from collections import Counter

colors = ["red", "blue", "red", "green", "blue", "red"]

# Method 1: Count a single item using list.count()
red_count = colors.count("red")
print("Occurrences of 'red':", red_count)

# Method 2: Count all items using collections.Counter (Fast and powerful)
color_counts = Counter(colors)
print("\nCounter Object:", color_counts)
print("Count of 'blue':", color_counts["blue"])

# Getting the top most common items
print("Most common color:", color_counts.most_common(1))

# Method 3: Counting manually using a loop and a standard dictionary
manual_counts = {}
for item in colors:
    manual_counts[item] = manual_counts.get(item, 0) + 1
print("\nManual dict count:", manual_counts)
Терминальный выход
Occurrences of 'red': 3

Counter Object: Counter({'red': 3, 'blue': 2, 'green': 1})
Count of 'blue': 2
Most common color: [('red', 3)]

Manual dict count: {'red': 3, 'blue': 2, 'green': 1}

Пошаговая реализация

  • Вызовите list_variable.count(value), если вам нужно количество только одного конкретного элемента в списке.
  • Импортируйте коллекции.Counter и передайте список, чтобы подсчитать все уникальные элементы за один оптимизированный проход.
  • Используйте метод .most_common(n) для объекта Counter, чтобы извлечь n первых наиболее часто встречающихся элементов.

Часто задаваемые вопросы

Что произойдет, если я найду отсутствующий ключ в объекте Collections.Counter?

В отличие от стандартного словаря, который выдает ошибку KeyError, объект Counter возвращает 0 для отсутствующих элементов, что соответствует нулю вхождений.

Какова временная сложность Counter по сравнению с циклическим подсчетом с помощью list.count()?

Counter подсчитывает все элементы за линейное время O(N), проходя по списку один раз. Перебор элементов списка и вызов list.count() занимают квадратичное время O(N^2), что очень медленно для больших списков.

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.