python计算元素的频率

时间:2015-01-13 22:02:40

标签: python list python-2.7

我有一个数字列表:

numlist = [601, 601, 601, 602, 602, 603, 1245, 1245, 1245, 1245, 1247, 1249, 1250,602,602]

此列表将始终如图所示“排序”,并在某个点之后重新启动值。

在该列表中,我需要对相同值的数量进行分组和计数,并将下一个项目添加到计数中,如果它的数值比前一个项目多一个(并且只有一个)。

预期结果:

>>>result
[6,4,1,2,2]

我能做到:

>>>from itertools import groupby
>>>[len(list(group)) for key, group in groupby(numlist)]
[3, 2, 1, 4, 1, 1, 1, 2]

它计算相同值的数量,但如何在组中包含如上所述的值?

更多解释:

浏览列表,如果下一项是相同的值或相同的值+1,则将它们分组。

1 个答案:

答案 0 :(得分:3)

两次申请itertools.groupby

from itertools import groupby

numlist = [601, 601, 601, 602, 602, 603, 1245, 1245, 1245, 1245, 1247, 1249, 1250,602,602]
group_first = ((k, sum(1 for _ in g)) for k, g in groupby(numlist))

在第一次分组后,我们会有类似的内容:

[(601, 3), (602, 2), (603, 1), (1245, 4), (1247, 1), (1249, 1), (1250, 1), (602, 2)]

现在我们需要再次对这些项目进行分组(按第一项),但这里的诀窍是使用enumerate对连续项目进行分组。这些项目与相应索引的区别总是相同的(哦!顺便说一下,我从Python 2.6' s itertools documentation中学到了这一点; - ))。

for k, g in groupby(enumerate(group_first), lambda (i, x):i-x[0]):
    print sum(v for i, (k, v) in g)