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)
我有一个数字列表:
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)