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
が基になるファイル オブジェクト反復子をラップする方法に似ています。この反復子を介して 1 つのパスを取得し、1 つのパスのみを取得します。itertools.izip 関数は、 の項目をペアにするプロセスでgroups
、groups
反復子を最初の項目から 2 番目の項目に進めます。イテレータを通過するのは 1 回だけなので、最初の項目は消費されているので、呼び出しlist(g[1])
たときは空です。
この問題のあまり満足のいく修正は、イテレータgroups
をリストに変換することです:
groups = (list(group) for key, group in groups)
したがって、itertools.izip
それらを時期尚早に消費することはありません。編集: よく考えてみると、この修正はそれほど悪くはありません。はイテレータのままで、消費されるとリストにgroups
変わるだけです。group