web-dev-qa-db-fra.com

Comment créer une copie de l'itérateur python?

Dans python j'ai essayé de créer une copie de mon itérateur en utilisant l'affectation mais il crée une copie de l'itérateur qui fait référence à l'itérateur original lui-même. Par exemple:

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

Comme vous le voyez dans l'exemple, first_it et second_it font référence au même objet itérateur. Est-il possible de créer une copie de l'objet itérateur qui ne fait pas référence à l'objet d'origine?

Note Cette question concerne la création d'une copie d'un objet itérateur par valeur. Alors ne mentionnez pas for item in my_list: comme des solutions.
Merci d'avance

15
Harun ERGUL

Utilisez la fonction itertools.tee() pour produire des copies; ceux-ci utilisent un tampon pour partager les résultats entre différents itérateurs:

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

Notez que vous ne devez plus utiliser l'itérateur d'origine; utilisez uniquement les tees.

Notez que le tampon signifie également que ceux-ci peuvent entraîner un coût de mémoire important si vous avancez l'une des copies bien avant les autres! De la documentation:

Cet outil peut nécessiter un stockage auxiliaire important (selon la quantité de données temporaires à stocker). En général, si un itérateur utilise la plupart ou la totalité des données avant le démarrage d'un autre itérateur, il est plus rapide d'utiliser list() au lieu de tee().

24
Martijn Pieters