Как посчитать частоту элементов в списке? - 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 ]

5 голосов
/ 30 января 2016

Я бы просто использовал scipy.stats.itemfreq следующим образом:

from scipy.stats import itemfreq

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

freq = itemfreq(a)

a = freq[:,0]
b = freq[:,1]

Вы можете проверить документацию здесь: http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.itemfreq.html

4 голосов
/ 06 декабря 2016
def frequencyDistribution(data):
    return {i: data.count(i) for i in data}   

print frequencyDistribution([1,2,3,4])

...

 {1: 1, 2: 1, 3: 1, 4: 1}   # originalNumber: count
3 голосов
/ 30 июня 2015

Этот ответ более явный

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

d = {}
for item in a:
    if item in d:
        d[item] = d.get(item)+1
    else:
        d[item] = 1

for k,v in d.items():
    print(str(k)+':'+str(v))

# output
#1:4
#2:4
#3:3
#4:2

#remove dups
d = set(a)
print(d)
#{1, 2, 3, 4}
3 голосов
/ 29 января 2010

Для вашего первого вопроса, итерируйте список и используйте словарь для отслеживания существования элементов.

Для вашего второго вопроса, просто используйте оператор set.

2 голосов
/ 26 октября 2018

Я опаздываю, но это тоже сработает и поможет другим:

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
freq_list = []
a_l = list(set(a))

for x in a_l:
    freq_list.append(a.count(x))


print 'Freq',freq_list
print 'number',a_l

будет производить это ..

Freq  [4, 4, 2, 1, 2]
number[1, 2, 3, 4, 5]
2 голосов
/ 09 апреля 2019
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]

# 1. Get counts and store in another list
output = []
for i in set(a):
    output.append(a.count(i))
print(output)

# 2. Remove duplicates using set constructor
a = list(set(a))
print(a)
  1. Набор коллекций не допускает дубликатов, передача списка конструктору set () даст итерируемые полностью уникальные объекты. Функция count () возвращает целое число при передаче объекта из списка. При этом подсчитываются уникальные объекты, и каждое значение счетчика сохраняется путем добавления к пустому списку вывода
  2. Конструктор list () используется для преобразования набора (a) в список и ссылается на ту же переменную a

выход

D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]
1 голос
/ 27 января 2018

Я использую Counter для генерации частоты. из слов текстового файла в 1 строке кода

def _fileIndex(fh):
''' create a dict using Counter of a
flat list of words (re.findall(re.compile(r"[a-zA-Z]+"), lines)) in (lines in file->for lines in fh)
'''
return Counter(
    [wrd.lower() for wrdList in
     [words for words in
      [re.findall(re.compile(r'[a-zA-Z]+'), lines) for lines in fh]]
     for wrd in wrdList])
1 голос
/ 26 января 2018
from collections import OrderedDict
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
def get_count(lists):
    dictionary = OrderedDict()
    for val in lists:
        dictionary.setdefault(val,[]).append(1)
    return [sum(val) for val in dictionary.values()]
print(get_count(a))
>>>[4, 4, 2, 1, 2]

Чтобы удалить дубликаты и сохранить порядок:

list(dict.fromkeys(get_count(a)))
>>>[4, 2, 1]
0 голосов
/ 22 февраля 2017
str1='the cat sat on the hat hat'
list1=str1.split();
list2=str1.split();

count=0;
m=[];

for i in range(len(list1)):
    t=list1.pop(0);
    print t
    for j in range(len(list2)):
        if(t==list2[j]):
            count=count+1;
            print count
    m.append(count)
    print m
    count=0;
#print m
0 голосов
/ 26 марта 2019

Для записи, функциональный ответ:

>>> L = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> import functools
>>> >>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc,1)] if e<=len(acc) else acc+[0 for _ in range(e-len(acc)-1)]+[1], L, [])
[4, 4, 2, 1, 2]

Будет чище, если вы посчитаете нули тоже:

>>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc)] if e<len(acc) else acc+[0 for _ in range(e-len(acc))]+[1], L, [])
[0, 4, 4, 2, 1, 2]

Объяснение:

  • мы начинаем с пустого acc списка;
  • если следующий элемент e из L меньше, чем размер acc, мы просто обновляем этот элемент: v+(i==e) означает v+1, если индекс i из acc является текущим элемент e, в противном случае предыдущее значение v;
  • если следующий элемент e из L больше или равен размеру acc, мы должны расширить acc, чтобы разместить новый 1.

Элементы не должны быть отсортированы (itertools.groupby). Вы получите странные результаты, если у вас будут отрицательные числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...