我有一个数字列表:
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,则将它们分组。
答案 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)