使用 itertools 按第二个值对连续元组进行分组

Posted

技术标签:

【中文标题】使用 itertools 按第二个值对连续元组进行分组【英文标题】:Using itertools to group consecutive tuples by second value 【发布时间】:2014-03-16 23:51:12 【问题描述】:

我在表格中有一组数据:

X1 = [(1,1),(3,1),(5,0),(3,0),(2,1)]

我不知道如何将它们分组:

X2 = [[(1,1),(3,1)],[(5,0),(3,0)],[(2,1)]]

即它们按每个元组中的第二个值连续分组。

我知道是这样的:

http://docs.python.org/2/library/itertools.html#itertools.groupby

【问题讨论】:

既然有更简单的方法,为什么还要使用 itertools? @Ol'Reliable:因为你的“更简单的方法”做了一些不同的事情。如果数据是[(0, 1), (1, 1), (2, 1), (0, 0), (0, 2)]怎么办? 输出应该是什么? [[(0, 1), (1, 1), (2, 1)], [(0, 0)], [(0, 2)]] 好吧好吧,对不起,我没有完全理解这个问题 【参考方案1】:
from itertools import groupby
from operator import itemgetter
X2 = [list(group) for key, group in groupby(X1, itemgetter(1))]

key 函数传递给groupby,该函数获取每个元组的第二项,因此groupby 按第二项对元组进行分组。

【讨论】:

...喜欢这种灵活性,所以我会选择这个。打得好!【参考方案2】:
from itertools import groupby, imap
from operator  import itemgetter

X1 = [(1,1),(3,1),(5,0),(3,0),(2,1)]
print map(list, imap(itemgetter(1), groupby(X1, itemgetter(1))))
# -> [[(1, 1), (3, 1)], [(5, 0), (3, 0)], [(2, 1)]]

【讨论】:

【参考方案3】:
x = [(1,1),(3,1),(5,0),(3,0),(2,1)]
y = [x[n:n+2] for n in range(0, len(x), 2)]
print(y)

【讨论】:

功能齐全,无需模块,流畅!

以上是关于使用 itertools 按第二个值对连续元组进行分组的主要内容,如果未能解决你的问题,请参考以下文章

如何按第一个值和第二个值对 pair<int, char> 的向量进行排序? [复制]

如何制作按第二个元素排序的最小元组堆?

python 排序 sorted 如果第一个条件 相同 则按第二个条件排序

按第二项(整数值)对元组列表进行排序[重复]

MYSQL先按第一个字段排序,若相同再按第二个字段排序,如何实现?

如何按第二个单词对列表进行排序? [复制]