嗨我有一个值列表。我希望获得另一个列表,其中包含该列表中每个值的出现次数。这很容易,但我还需要将原始列表中不存在的值存在于频率列表中,然后使用值0.例如:
I = [0,1,1,2,2,2,4,4,5,5,6,6,6,8,8,8]
您的期望:
freqI = [1,2,3,2,2,2,3,3]
我需要什么:
freqI = [1,2,3,0,2,2,3,0,3]
正如您所见, I 中不存在3和7,但它们仍在频率列表中列出。
我最初的尝试最终给了我第一种解决方案(带有中间值):
d = {x:I.count(x) for x in I}
sorted_x = sorted(d.iteritems(), key=operator.itemgetter(0))
如何获得数组的频率计数(也就是直方图),中间值是否存在?
答案 0 :(得分:8)
>>> lis = [0,1,1,2,2,2,4,4,5,5,6,6,6,8,8,8]
>>> maxx,minn = max(lis),min(lis)
>>> from collections import Counter
>>> c = Counter(lis)
>>> [c[i] for i in xrange(minn,maxx+1)]
[1, 2, 3, 0, 2, 2, 3, 0, 3]
或根据@DSM的建议,我们可以从min
本身获取max
和dict
:
>>> [c[i] for i in xrange( min(c) , max(c)+1)]
[1, 2, 3, 0, 2, 2, 3, 0, 3]
答案 1 :(得分:5)
怎么样
>>> I = [0,1,1,2,2,2,4,4,5,5,6,6,6,8,8,8]
>>> from collections import Counter
>>> frequencies = Counter(I)
>>> frequencies
Counter({2: 3, 6: 3, 8: 3, 1: 2, 4: 2, 5: 2, 0: 1})
您可以在计数器中查询任何数字。对于未见过的数字,它给出0
>>> frequencies[42]
0
答案 2 :(得分:2)
[I.count(k) for k in range(max(I+1))]
答案 3 :(得分:2)
您的列表看起来像是按顺序排列,如果是这样,这是最好的方法:
>>> from collections import Counter
>>> I = [0,1,1,2,2,2,4,4,5,5,6,6,6,8,8,8]
>>> c = Counter(I)
>>> [c[i] for i in range(I[0], I[-1]+1)]
[1, 2, 3, 0, 2, 2, 3, 0, 3]
答案 4 :(得分:1)
你很亲密;你只想迭代一个生成器而不是你的实际列表。像这样:
# note: lowercase variable names are Python standard and good coding practice!
d = {n:list_of_ints.count(n) for n in range(max(list_of_ints))}
请注意,我使用max(I)
,这只是列表中最大的元素,因为您没有指定上限。显然,您可以对此数字进行硬编码,或者如果您想将直方图限制在I
中的数据范围内,则可以将其设为range(min(I), max(I))
。