Питонический способ копирования повторяемого объекта

Для небольшого проекта, над которым я работаю, мне нужно циклически просмотреть список. Для каждого элемента этого цикла я должен начать другой цикл через тот же список, с первым элементом в качестве первого элемента нового цикла. Например, я хотел бы создать что-то вроде этого:

1, 2, 3, 4, 1, 2, 3, 4, 1, ...
2, 3, 4, 1, 2, 3, 4, 1, 2, ...
3, 4, 1, 2, 3, 4, 1, 2, 3, ...
4, 1, 2, 3, 4, 1, 2, 3, 4, ...
1, 2, 3, 4, 1, 2, 3, 4, 1, ...
...

Я думал, что копирование itertools.cycle после каждого .next () сохранит текущее состояние, так что я могу начать новый цикл с элементом из «внешний» цикл. Или даже «сбросьте указатель цикла» на более старую позицию. Я пробовал следующее:

>>> import itertools, copy
>>> a = itertools.cycle([1, 2, 3, 4])
>>> b = copy.copy(a)

, но получил эту ошибку:

Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python2.6/copy.py", line 95, in copy
    return _reconstruct(x, rv, 0)
  File "/usr/lib/python2.6/copy.py", line 323, in _reconstruct
    y = callable(*args)
  File "/usr/lib/python2.6/copy_reg.py", line 93, in __newobj__
    return cls.__new__(cls, *args)
TypeError: cycle expected 1 arguments, got 0

Я знаю, что есть много разных способов добиться того, чего я хочу, но я ищу короткий, ясный и питонический код. Может у кого-то есть еще идея или еще отрывок? Тот факт, что невозможно скопировать объекты-итераторы , разбудил мой интерес. Есть ли лучшая практика в ситуациях, когда требуется копия итеративного? Или копирование итераций глупо и вообще бесполезно?

5
задан atomocopter 29 September 2010 в 23:58
поделиться