4

嗨,我有一个值列表。我想获得另一个列表,其中包含该列表中每个值出现的次数。这相当容易,但我还需要将原始列表中不存在的值存在于频率列表中,但随后值为 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))

如何在存在中间值的情况下获取数组的频率计数(也称为直方图)?

4

5 回答 5

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和获取:maxdict

>>> [c[i] for i in xrange( min(c) , max(c)+1)]
[1, 2, 3, 0, 2, 2, 3, 0, 3]
于 2013-05-27T19:37:54.553 回答
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
于 2013-05-27T19:37:46.880 回答
2
[I.count(k) for k in range(max(I+1))]
于 2013-05-27T19:36:32.940 回答
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]
于 2013-05-27T20:05:47.673 回答
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))

于 2013-05-27T19:37:34.443 回答