私が取り組んでいる小さなプロジェクトでは、リストを循環する必要があります。このサイクルの各要素について、前の要素を新しいサイクルの最初の要素として、同じリストを介して別のサイクルを開始する必要があります。たとえば、次のようなものを作成できるようにしたいと考えています。
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
私が望むものを達成するにはさまざまな方法があることは知っていますが、短くて明確でpythonicなコードを探しています。誰かが別のアイデアやスニペットを持っているかもしれませんか? イテレータ オブジェクトをコピーできないという事実が、私の興味をかき立てました。イテラブルのコピーが必要な状況でのベストプラクティスはありますか? それとも、イテラブルをコピーするのはばかげていて、一般的に役に立たないのでしょうか?