web-dev-qa-db-ja.com

pythonイテレータのコピーを作成するには?

python私は割り当てを使用してイテレータのコピーを作成しようとしましたが、元のイテレータ自体を参照するイテレータのコピーを作成しました。たとえば:

my_list = [5, 4, 3,2]
first_it = iter(my_list)
second_it = first_it 
print next(first_it )        #it will print 5
print next(second_it)        #it will print 4
print next(first_it )        #it will print 3

例にあるように、first_itとsecond_itは両方とも同じ反復子オブジェクトを参照します。元のオブジェクトへの参照ではないイテレータオブジェクトのコピーを作成することは可能ですか?

この質問は、値によってイテレータオブジェクトのコピーを作成する方法に関するものです。したがって、for item in my_list:のようなソリューション。
前もって感謝します

15
Harun ERGUL

itertools.tee() function を使用してコピーを作成します。これらはバッファを使用して、異なるイテレータ間で結果を共有します。

_from itertools import tee

my_list = [5, 4, 3,2]
first_it = iter(my_list)
first_it, second_it = tee(first_it)
print next(first_it)   # prints 5
print next(second_it)  # prints 5
print next(first_it)   # prints 4
_

元のイテレータは使用しないでください。ティーのみを使用してください。

バッファは、コピーの1つを他のコピーよりも先に進めると、これらがかなりのメモリコストを招く可能性があることにも注意してください!ドキュメントから:

このitertoolには、大量の補助記憶装置が必要になる場合があります(一時データをどれだけ保存する必要があるかによって異なります)。一般に、あるイテレーターが別のイテレーターが開始する前にほとんどまたはすべてのデータを使用する場合、list()の代わりにtee()を使用する方が高速です。

24
Martijn Pieters