如何计算列表中元素的频率?

我是一个蟒蛇新手,所以请忍受我。

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

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] 

由于列表是有序的,你可以这样做:

 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] 

在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或更高版本,可以在这里下载。

Python 2.7+引入了Dictionary Comprehension。 从列表中建立词典将得到你的计数以及摆脱重复。

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

要计算出场次数:

 from collections import defaultdict appearances = defaultdict(int) for curr in a: appearances[curr] += 1 

删除重复项目:

 a = set(a) 

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

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

要删除重复项,请使用set:

 a = list(set(a)) 

在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] 
 seta = set(a) b = [a.count(el) for el in seta] a = list(seta) #Only if you really want it. 

这个答案更加明确

 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} 

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

对于第二个问题,只需使用set操作符。

我会简单地使用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

你可以这样做:

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

另一个解决方案与另一个算法没有使用集合:

 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 
 #!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() 
 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) 

你可以使用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

还有一种方法是使用一个字典和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) 
 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