python 元素的计数频率

python counting frequency of elements

我有一个数字列表:

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

此列表将始终如所示 "sorted",值在特定点后重新开始。

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

预期结果:

>>>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,则将它们分组。

应用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 的 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)