2017-08-30 2 views
1

Est-ce que quelqu'un sait quelque chose d'équivalent à itertools.tee mais avec la possibilité d'ajouter dynamiquement des itérateurs?Python: itertools.tee avec des itérateurs créés dynamiquement

La fonction itertools.tee fait exactement ce que je veux, sauf que le nombre d'itérateurs doit être fixé lors de l'appel de la fonction. Je voudrais quelque chose avec des fonctionnalités équivalentes, mais qui permette d'ajouter de nouveaux itérateurs plus tard, potentiellement même après que certains itérateurs aient commencé à itérer. Je voudrais éviter d'appeler itertools.tee plusieurs fois, car cela va potentiellement utiliser beaucoup de mémoire (je pourrais avoir des millions d'itérateurs). De la documentation Python pour itertools.tee:

Le code suivant Python permet d'expliquer ce tee fait (bien que la mise en œuvre effective est plus complexe et utilise une seule file d'attente FIFO sous-jacente).

...

Si de nouveaux itérateurs sont ajoutés par la suite, ils ne doivent voir les données nouvellement arrivée.

Voici un exemple de code de ce que je voudrais avoir (peut-être pas syntaxiquement correct):

input_iterator = iter([1, 2, 3, 4, 5, 6]) 
tee = EnhancedTee(input_iterator) 
it1 = iter(tee) 
val = it1.next() 
# val == 1 
it2 = iter(tee) 
val = it2.next() 
# val == 2 
val = it1.next() 
# val == 2 
+0

nous montrer un exemple, car pour autant que je l'ai lu et je sais que vous pouvez toujours utiliser Vous 'tee' – Netwave

+0

devra stocker tous les éléments dans l'itérateur pour faire de cette travailler de toute façon, il suffit de le convertir en une liste. Vous pouvez créer autant d'itérateurs que vous le souhaitez pour une liste en utilisant 'iter (my_list)'. –

+2

* potentiellement même après que certains des itérateurs ont commencé à itérer *, alors pourquoi ne pas garder un itérateur de référence et en faire de nouvelles copies avec 'tee' quand vous en aurez besoin. –

Répondre

0

Cela a presque été déjà répondu à une autre question: In python, can I lazily generate copies of an iterator using tee?. Cependant, la réponse dont j'avais besoin était légèrement différente de la réponse donnée à cette question. Je n'ai besoin que des itérateurs nouvellement créés pour voir de nouvelles données, donc j'ai seulement besoin de tee un seul itérateur au départ, et d'en faire des copies. Ainsi, les œuvres suivantes bien pour moi:

input_iterator = iter([1, 2, 3, 4, 5, 6]) 
it1 = itertools.tee(input_iterator, 1)[0] 
print(next(it1)) 
# prints 1 
it2 = copy(it1) 
print(next(it2)) 
# prints 2 
print(next(it1)) 
# prints 2