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)]
в итератор. То, что групповой итератор обернут вокруг базового итератора данных, аналогичен тому, как csv.reader
обернут вокруг итератора основного файла. Вы получаете один проход через этот итератор и только один проход. Функция itertools.izip в процессе сопряжения элементов в groups
приводит к тому, что итератор groups
переходит от первого элемента ко второму. Поскольку вы получаете только один проход через итератор, первый элемент был израсходован, поэтому, когда вы вызываете list(g[1])
, он пуст.
не так удовлетворяющие
исправления этой проблемы заключается в преобразовании итераторов в groups
в списки:
groups = (list(group) for key, group in groups)
так itertools.izip
не будет преждевременно потреблять их. Edit: С другой стороны, это исправление не так уж плохо. groups
остается итератором и только превращает group
в список, когда он потребляется.
Ваша правка как поучительно, как обычно :) – root