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迭代器包装在底层数据迭代器中,类似于csv.reader
如何包装底层文件对象迭代器。你只能通过这个迭代器一次,只有一次通过。 itertools.izip函数在配对groups
中的项目过程中会导致迭代器从第一项前进到第二项。由于您只能通过迭代器一次,所以第一项已被使用,所以当您拨打list(g[1])
时,它是空的。
一个
不那么满意
修复这个问题是迭代器转换成groups
到列表:
groups = (list(group) for key, group in groups)
所以itertools.izip
不会过早食用。编辑:第二个想法,这个修复不是很糟糕。 groups
仍然是一个迭代器,并且仅在消耗时才将group
转换为列表。
你的编辑和往常一样:) – root 2013-02-14 13:59:09