import itertools as IT
groups = IT.groupby([(1,2,3),(1,2),(1,2),(3,4,5),(3,4)], key=len)
groups = (list(group) for key, group in groups)
def grouped(iterable, n):
return IT.izip(*[iterable]*n)
for p1, p2 in grouped(groups, 2):
print p1, p2
产量
[(1, 2, 3)] [(1, 2), (1, 2)]
[(3, 4, 5)] [(3, 4)]
您发布的代码非常有趣。它有一个世俗的问题,也有一个微妙的问题。
普通的问题是 itertools.groupby 返回一个迭代器,它在每次迭代时都输出一个键和一个组。由于您只对组感兴趣,而不是键,因此您需要类似
groups = (group for key, group in groups)
微妙的问题更难以解释——我不确定我是否完全理解它。这是我的猜测:返回的迭代器groupby
已经改变了它的输入,
[(1,2,3),(1,2),(1,2),(3,4,5),(3,4)]
进入一个迭代器。groupby 迭代器环绕底层数据迭代器类似于 acsv.reader
环绕底层文件对象迭代器。您通过此迭代器获得一次通过,并且仅通过一次。itertools.izip 函数在配对项目的过程中groups
,使groups
迭代器从第一个项目前进到第二个项目。由于您只通过迭代器,因此第一个项目已被消耗,因此当您调用list(g[1])
它时它是空的。
解决这个问题的一个不太令人满意的方法是将迭代器转换groups
为列表:
groups = (list(group) for key, group in groups)
所以itertools.izip
不会过早地消耗它们。编辑:再想一想,这个修复还不错。groups
仍然是一个迭代器,并且仅在使用时将其group
转换为列表。