Я закодировал себя как общие версии кортежей, мне нравится первая из-за ее элегантной простоты, чем больше я на нее смотрю, тем более питонской она мне кажется ... в конце концов, что более питонское, чем одно вкладыш с zip, расширение аргумента звездочкой, списки, списки, списки и «диапазон»?
def ntuples(lst, n):
return zip(*[lst[i:]+lst[:i] for i in range(n)])
Версия itertools должна быть достаточно эффективной даже для больших списков ...
from itertools import *
def ntuples(lst, n):
return izip(*[chain(islice(lst,i,None), islice(lst,None,i)) for i in range(n)])
И версия для неиндексируемых последовательностей:
from itertools import *
def ntuples(seq, n):
iseq = iter(seq)
curr = head = tuple(islice(iseq, n))
for x in chain(iseq, head):
yield curr
curr = curr[1:] + (x,)
В любом случае, спасибо всем за ваши предложения! : -)