Этот подход поддерживает произвольное количество элементов на результат, оценивает лениво, и итеративный ввод может быть генератором (индексация не предпринимается):
import itertools
def groups_of_n(n, iterable):
c = itertools.count()
for _, gen in itertools.groupby(iterable, lambda x: c.next() / n):
yield gen
Все оставшиеся элементы возвращаются в более коротком списке.
Пример использования:
for g in groups_of_n(4, xrange(21)):
print list(g)
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
[16, 17, 18, 19]
[20]