如何使用python groupby()

时间:2017-06-27 07:17:44

标签: python itertools

当我尝试使用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)

为什么不正确地对相同的数字进行分组?

3 个答案:

答案 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() ]