对于我正在处理的一个小项目,我需要循环浏览一个列表。对于这个循环的每个元素,我必须通过同一个列表开始另一个循环,前一个元素作为新循环的第一个元素。例如,我希望能够产生这样的东西:
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, ...
...
我认为在每个 .next() 之后复制 itertools.cycle 会保存当前状态,这样我就可以使用“外部”循环中的元素开始新循环。甚至“将循环指针”“重置”到较旧的位置。我尝试了以下方法:
>>> import itertools, copy
>>> a = itertools.cycle([1, 2, 3, 4])
>>> b = copy.copy(a)
但收到此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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
我知道有很多不同的方法可以实现我想要的,但我正在寻找一些简短、清晰和 python 的代码。也许有人有另一个想法,甚至是一个片段?无法复制迭代器对象这一事实引起了我的兴趣。在需要可迭代副本的情况下是否有最佳实践?还是一般来说复制迭代是愚蠢和无用的?