Шаг 13.
Python: сборник рецептов. Структуры данных и алгоритмы. Определение наиболее часто встречающихся элементов в последовательности

    На этом шаге мы рассмотрим пример использования класса collections.Counter.

Задача

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

Решение

    Класс collections.Counter разработан как раз для решения подобных задач. В нем даже есть удобный метод most_common(), который сразу выдаст вам ответ.

    Чтобы проиллюстрировать это, предположим, что у вас есть список слов, и вы хотите найти наиболее часто встречающееся. Вот как можно это сделать:

>>> words = [
	'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
	'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the',
	'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into',
	'my', 'eyes', "you're", 'under'
	]
>>> from collections import Counter
>>> word_counts = Counter(words)
>>> top_three = word_counts.most_common(3)
>>> print(top_three)
[('eyes', 8), ('the', 5), ('look', 4)]
>>> 


Обсуждение

    На входе объектам класса Counter можно скормить любую последовательность хешируемых элементов. В основе Counter лежит словарь, который отображает количество вхождений элементов. Например:

>>> word_counts['not']
1
>>> word_counts['eyes']
8
>>>

    Если вы хотите увеличить счет вручную, используйте сложение:

>>> morewords = ['why', 'are', 'you', 'not', 'looking', 'in', 'my', 'eyes']
>>> for word in morewords:
	word_counts[word] += 1

	
>>> word_counts['eyes']
9
>>> 

    Или же вы можете использовать метод update():

>>> word_counts.update(morewords)
>>>

    Малоизвестная возможность экземпляров Counter состоит в том, что они могут быть легко скомбинированы с использованием разнообразных математических операций. Например:

>>> a = Counter(words)
>>> b = Counter(morewords)
>>> a
Counter({'eyes': 8, 'the': 5, 'look': 4, 'into': 3, 'my': 3, 'around': 2, 
'not': 1, "don't": 1, "you're": 1, 'under': 1})
>>> b
Counter({'why': 1, 'are': 1, 'you': 1, not': 1, 'looking': 1, 'in': 1, 'my': 1, 'eyes': 1})
>>> # Объединяем счетчики
>>> c = a + b
>>> c
Counter({'eyes': 9, 'the': 5, 'look': 4, 'my': 4, 'into': 3, 'not': 2, 
'around': 2, "don't": 1, "you're": 1, 'under': 1, 'why': 1, 'are': 1, 'you': 1, 
'looking': 1, 'in': 1})
>>> # Вычитаем счетчики
>>> d = a - b
>>> d
Counter({'eyes': 7, 'the': 5, 'look': 4, 'into': 3, 'my': 2, 'around': 2, 
"don't": 1, "you're": 1, 'under': 1})
>>> 

    Нет смысла упоминать, что объекты Counter - невероятно полезный инструмент для практически любых задач, где вам нужно перевести данные в табличную форму и посчитать их. Рекомендуем использовать этот способ, а не писать вручную решения на основе словарей.

    На следующем шаге мы рассмотрим сортировку списка словарей по общему ключу.




Предыдущий шаг Содержание Следующий шаг