268

我需要在无序列表中找到元素的频率

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]
4

34 回答 34

610

在 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)]

print(dict(counter))
# {1: 4, 2: 4, 3: 2, 5: 2, 4: 1}

如果您使用的是 Python 2.6 或更早版本,您可以在此处下载。

于 2010-01-29T13:02:41.023 回答
169

注意:您应该在使用之前对列表进行排序groupby

如果列表是有序列表,您可以使用groupbyfrom package。itertools

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]

更新:请注意,排序需要 O(n log(n)) 时间。

于 2010-01-29T12:18:39.173 回答
115

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]
于 2012-03-16T20:44:01.727 回答
50

计算出现次数:

from collections import defaultdict

appearances = defaultdict(int)

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

要删除重复项:

a = set(a) 
于 2010-01-29T12:16:03.907 回答
33

在 Python 2.7+ 中,您可以使用collections.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]
于 2010-01-29T13:00:53.413 回答
29

计算元素的频率可能最好用字典来完成:

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

要删除重复项,请使用一组:

a = list(set(a))
于 2010-01-29T12:16:19.230 回答
20

这是另一个简洁的替代方法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}
于 2019-03-31T02:17:50.067 回答
19

你可以这样做:

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]
于 2017-07-23T18:11:17.000 回答
10
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'])
于 2017-12-27T19:39:37.497 回答
8

我会以下列方式简单地使用 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

于 2016-01-30T18:35:39.140 回答
7
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
于 2010-01-29T12:18:15.670 回答
6

数据。假设我们有一个列表:

fruits = ['banana', 'banana', 'apple', 'banana']

解决方案。然后我们可以通过执行以下操作找出列表中每种水果的数量:

import numpy as np    
(unique, counts) = np.unique(fruits, return_counts=True)
{x:y for x,y in zip(unique, counts)}

输出

{'banana': 3, 'apple': 1}
于 2020-09-21T17:05:13.867 回答
4

对于您的第一个问题,迭代列表并使用字典来跟踪元素的存在。

对于第二个问题,只需使用 set 运算符。

于 2010-01-29T12:10:59.923 回答
4

这个答案更明确

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}
于 2015-06-30T18:39:12.967 回答
4

我已经很晚了,但这也可以,并且会帮助其他人:

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]
于 2018-10-26T15:17:10.370 回答
3
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
于 2016-12-06T16:50:55.100 回答
2

要在列表中查找唯一元素:

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

使用字典查找排序数组中唯一元素的计数:

def CountFrequency(my_list): 
# Creating an empty dictionary  
freq = {} 
for item in my_list: 
    if (item in freq): 
        freq[item] += 1
    else: 
        freq[item] = 1

for key, value in freq.items(): 
    print ("% d : % d"%(key, value))

# Driver function 
if __name__ == "__main__":  
my_list =[1, 1, 1, 5, 5, 3, 1, 3, 3, 1, 4, 4, 4, 2, 2, 2, 2] 

CountFrequency(my_list)

参考:

GeeksforGeeks

于 2020-05-28T04:54:13.967 回答
2

使用字典的简单解决方案。

def frequency(l):
     d = {}
     for i in l:
        if i in d.keys():
           d[i] += 1
        else:
           d[i] = 1

     for k, v in d.iteritems():
        if v ==max (d.values()):
           return k,d.keys()

print(frequency([10,10,10,10,20,20,20,20,40,40,50,50,30]))
于 2019-04-18T23:32:45.847 回答
2
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 集合不允许重复,将列表传递给 set() 构造函数将提供完全唯一对象的可迭代。count() 函数在传递列表中的对象时返回整数计数。这样可以计算唯一对象,并通过附加到空列表输出来存储每个计数值
  2. list() 构造函数用于将 set(a) 转换为 list 并由同一个变量 a 引用

输出

D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]
于 2019-04-09T12:00:11.717 回答
1
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]
于 2018-01-26T09:26:04.853 回答
1
#!usr/bin/python
def frq(words):
    freq = {}
    for w in words:
            if w in freq:
                    freq[w] = freq.get(w)+1
            else:
                    freq[w] =1
    return freq

fp = open("poem","r")
list = fp.read()
fp.close()
input = list.split()
print input
d = frq(input)
print "frequency of input\n: "
print d
fp1 = open("output.txt","w+")
for k,v in d.items():
fp1.write(str(k)+':'+str(v)+"\n")
fp1.close()
于 2015-07-10T09:31:01.240 回答
1

找到了另一种方法,使用集合。

#ar is the list of elements
#convert ar to set to get unique elements
sock_set = set(ar)

#create dictionary of frequency of socks
sock_dict = {}

for sock in sock_set:
    sock_dict[sock] = ar.count(sock)
于 2020-04-23T17:36:39.203 回答
1
num=[3,2,3,5,5,3,7,6,4,6,7,2]
print ('\nelements are:\t',num)
count_dict={}
for elements in num:
    count_dict[elements]=num.count(elements)
print ('\nfrequency:\t',count_dict)
于 2017-09-03T18:40:29.630 回答
1

我正在使用计数器来生成频率。1行代码中的文本文件单词的dict

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])
于 2018-01-27T09:37:28.087 回答
1

这样做的另一种方法,尽管使用的是更重但功能强大的库 - NLTK。

import nltk

fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()
于 2019-09-29T16:38:05.727 回答
0

不使用集合的另一种算法的另一种解决方案:

def countFreq(A):
   n=len(A)
   count=[0]*n                     # Create a new list initialized with '0'
   for i in range(n):
      count[A[i]]+= 1              # increase occurrence for value A[i]
   return [x for x in count if x]  # return non-zero count
于 2015-12-20T08:17:38.460 回答
0
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
d = {}
[d.setdefault(el, []).append(1) for el in a]
counts = {k: len(v) for k, v in d.items()}
counts
# {1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
于 2021-10-19T04:00:14.943 回答
0

对于无序列表,您应该使用:

[a.count(el) for el in set(a)]

输出是

[4, 4, 2, 1, 2]
于 2020-09-17T15:49:25.753 回答
0

作为记录,一个功能性的答案:

>>> 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如果 的索引iacc当前元素e,否则是前一个值v
  • e如果的下一个元素L大于或等于 的大小acc,我们必须扩展acc以承载新的1

元素不必排序 ( itertools.groupby)。如果你有负数,你会得到奇怪的结果。

于 2019-03-26T17:52:39.830 回答
0

您可以使用python中提供的内置函数

l.count(l[i])


  d=[]
  for i in range(len(l)):
        if l[i] not in d:
             d.append(l[i])
             print(l.count(l[i])

上面的代码会自动删除列表中的重复项,并打印原始列表中每个元素的频率以及没有重复项的列表。

一枪两鸟!XD

于 2017-10-30T14:49:28.227 回答
0

如果您不想使用任何库并保持简单和简短,可以尝试这种方法!

a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
marked = []
b = [(a.count(i), marked.append(i))[0] for i in a if i not in marked]
print(b)

o/p

[4, 4, 2, 1, 2]
于 2017-12-06T18:44:18.293 回答
-1
a=[1,2,3,4,5,1,2,3]
b=[0,0,0,0,0,0,0]
for i in range(0,len(a)):
    b[a[i]]+=1
于 2018-02-21T02:44:56.323 回答
-1

另一种方法是使用字典和 list.count,下面是一种天真的方法。

dicio = dict()

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

b = list()

c = list()

for i in a:

   if i in dicio: continue 

   else:

      dicio[i] = a.count(i)

      b.append(a.count(i))

      c.append(i)

print (b)

print (c)
于 2017-04-19T19:25:36.640 回答
-4
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
于 2017-02-22T02:00:52.067 回答