Вопрос-Ответ

How to count the frequency of the elements in an unordered list? [duplicate]

Как посчитать частоту элементов в неупорядоченном списке?

Учитывая неупорядоченный список значений типа

a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]

Как я могу получить частоту каждого значения, которое появляется в списке, вот так?

# `a` has 4 instances of `1`, 4 of `2`, 2 of `3`, 1 of `4,` 2 of `5`
b = [4, 4, 2, 1, 2] # expected output
Переведено автоматически
Ответ 1

В Python 2.7 (или новее) вы можете использовать collections.Counter:

>>> import collections
>>> a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
>>> counter = collections.Counter(a)
>>> counter
Counter({1: 4, 2: 4, 5: 2, 3: 2, 4: 1})
>>> counter.values()
dict_values([2, 4, 4, 1, 2])
>>> counter.keys()
dict_keys([5, 1, 2, 4, 3])
>>> counter.most_common(3)
[(1, 4), (2, 4), (5, 2)]
>>> dict(counter)
{5: 2, 1: 4, 2: 4, 4: 1, 3: 2}
>>> # Get the counts in order matching the original specification,
>>> # by iterating over keys in sorted order
>>> [counter[x] for x in sorted(counter.keys())]
[4, 4, 2, 1, 2]

Если вы используете Python 2.6 или более поздней версии, вы можете скачать реализацию здесь.

Ответ 2

Если список отсортирован, вы можете использовать groupby из itertools стандартной библиотеки (если это не так, вы можете просто сначала отсортировать его, хотя это займет O (n lg n) времени):

from itertools import groupby

a = [5, 1, 2, 2, 4, 3, 1, 2, 3, 1, 1, 5, 2]
[len(list(group)) for key, group in groupby(sorted(a))]

Вывод:

[4, 4, 2, 1, 2]
Ответ 3

Python 2.7+ вводит понимание словаря. Создание словаря из списка позволит вам подсчитать количество элементов, а также избавиться от дубликатов.

>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> d = {x:a.count(x) for x in a}
>>> d
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
>>> a, b = d.keys(), d.values()
>>> a
[1, 2, 3, 4, 5]
>>> b
[4, 4, 2, 1, 2]
Ответ 4

Подсчитайте количество появлений вручную, перебрав список и подсчитав их, используя collections.defaultdict для отслеживания того, что было замечено на данный момент:

from collections import defaultdict

appearances = defaultdict(int)

for curr in a:
appearances[curr] += 1
python list