Как посчитать частоту элементов в списке? - PullRequest
192 голосов
/ 29 января 2010

Мне нужно найти частоту элементов в списке

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

выход ->

b = [4,4,2,1,2]

Также я хочу удалить дубликаты из

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

Ответы [ 28 ]

461 голосов
/ 29 января 2010

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

import collections
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
counter=collections.Counter(a)
print(counter)
# Counter({1: 4, 2: 4, 3: 2, 5: 2, 4: 1})
print(counter.values())
# [4, 4, 2, 1, 2]
print(counter.keys())
# [1, 2, 3, 4, 5]
print(counter.most_common(3))
# [(1, 4), (2, 4), (3, 2)]

Если вы используете Python 2.6 или старше, вы можете скачать его здесь .

120 голосов
/ 29 января 2010

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

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

Выход:

[4, 4, 2, 1, 2]
96 голосов
/ 17 марта 2012

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]
45 голосов
/ 29 января 2010

Для подсчета количества появлений:

from collections import defaultdict

appearances = defaultdict(int)

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

Чтобы удалить дубликаты:

a = set(a) 
23 голосов
/ 29 января 2010

Подсчет частоты элементов, вероятно, лучше всего сделать с помощью словаря:

b = {}
for item in a:
    b[item] = b.get(item, 0) + 1

Для удаления дубликатов используйте набор:

a = list(set(a))
21 голосов
/ 29 января 2010

В Python 2.7+ вы можете использовать collection.Counter для подсчета предметов

>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>>
>>> from collections import Counter
>>> c=Counter(a)
>>>
>>> c.values()
[4, 4, 2, 1, 2]
>>>
>>> c.keys()
[1, 2, 3, 4, 5]
9 голосов
/ 23 июля 2017

Вы можете сделать это:

import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)

Выход:

(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))

Первый массив - это значения, а второй массив - это количество элементов с этими значениями.

Итак, если вы хотите получить массив с числами, вы должны использовать это:

np.unique(a, return_counts=True)[1]
8 голосов
/ 31 марта 2019

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

from itertools import groupby

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

results = {value: len(list(freq)) for value, freq in groupby(sorted(items))}

Результаты

{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
7 голосов
/ 27 декабря 2017
from collections import Counter
a=["E","D","C","G","B","A","B","F","D","D","C","A","G","A","C","B","F","C","B"]

counter=Counter(a)

kk=[list(counter.keys()),list(counter.values())]

pd.DataFrame(np.array(kk).T, columns=['Letter','Count'])
7 голосов
/ 29 января 2010
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...