当我尝试使用itertools.groupby对这样的数字列表进行分组时:
from itertools import groupby
a = [1, 2, 1, 3, 2, 1, 2, 3, 4, 5]
for key, value in groupby(a):
print((len(list(value)), key), end=' ')
输出
(1, 1) (1, 2) (1, 1) (1, 3) (1, 2) (1, 1) (1, 2) (1, 3) (1, 4) (1, 5)
而不是
(3, 1) (3, 2) (2, 3) (1, 4) (1, 5)
为什么不正确地对相同的数字进行分组?
答案 0 :(得分:2)
itertools.groupby
仅对连续元素进行分组。因此,您需要在执行groupby
之前进行排序。
from itertools import groupby
a = sorted([1, 2, 1, 3, 2, 1, 2, 3, 4, 5])
for key, value in groupby(a):
print((len(list(value)), key), end=' ')
<强>结果强>
(3, 1)
(3, 2)
(2, 3)
(1, 4)
(1, 5)
答案 1 :(得分:2)
使用groupby()
的公共密钥元素对输入进行分组仅适用于已按该密钥排序的输入:
[...]通常,迭代需要已经在相同的键函数上排序。
你的例子应该是这样的:
from itertools import groupby
a = sorted([1, 2, 1, 3, 2, 1, 2, 3, 4, 5])
for key, value in groupby(a):
print((len(list(value)), key), end=' ')
如果在无序输入上使用groupby()
,那么每次迭代迭代时key
函数返回不同的键时,您都会得到一个新组。
答案 2 :(得分:2)
根据您的输出要求,我会更改您的问题。 collections.Counter在这里使用起来很简单
from collections import Counter
a = [1, 2, 1, 3, 2, 1, 2, 3, 4, 5]
[ (v, k) for k, v in Counter(a).items() ]