>>> from itertools import groupby
>>> from operator import itemgetter
>>> L = [(1,2), (1,6), (3,4), (3,6), (1,4), (4,3)]
>>> [[y for x, y in v] for k, v in groupby(sorted(L), itemgetter(0))]
[[2, 4, 6], [4, 6], [3]]
<强 > 排除 强 >
使用 < a href=> http://docs.python.org/library/teritertools.html#itertools.groupby" rel="nofollow"\\code>retertools.groupby 。 group
在可循环的组中发现 < 强性 > concutive , 通过密钥、组配对返回循环器 。
给 groupby
的参数是一个关键函数, itemgetter(0)
, 每一个图普都要求这个功能, 返回第一个项目作为 group
的密钥。
groupby
group 中包含元素的“强度”原始顺序 强度> 。 因此,如果您想要按列表的第一个数字分组,它必须首先进行排序,这样 groupby
可以按升序排列第一个数字,并实际分组。
>>> sorted(L)
[(1, 2), (1, 4), (1, 6), (3, 4), (3, 6), (4, 3)]
有排序列表, 您可以在列表中清楚地看到如果返回最终输出将会创建的组。 现在您可以使用 < code> groupby code> 来显示密钥, 组配对 。
[(1, <itertools._grouper object at 0x02BB7ED0>), (3, <itertools._grouper object at 0x02BB7CF0>), (4, <itertools._grouper object at 0x02BB7E30>)]
这是按第一个数字分组的分类项目。 groupby
返回每个密钥的组为代号, 这是巨大且高效的, 但对于这个例子, 我们只需将它转换为 < code> list , 以确保它正常工作 。
>>> [(k, list(v)) for k,v in groupby(sorted(L), itemgetter(0))]
[(1, [(1, 2), (1, 4), (1, 6)]), (3, [(3, 4), (3, 6)]), (4, [(4, 3)])]
这几乎是正确的,但所要求的产出只显示每个列表中组数的第二位。 因此,以下各点可以达到预期的结果。
[[y for x, y in v] for k, v in groupby(sorted(L), itemgetter(0))]