2017-08-02 3 views
3

Versuchen, mein Problem zu lösen mit Kette von Itertools. Ich habe eine Liste von Iteratoren und ich möchte einen Iterator bekommen, der Elemente der Iteratoren in der Liste nahtlos durchläuft. Gibt es einen Weg dazu? Vielleicht wäre ein anderes Werkzeug statt einer Kette besser geeignet?Verkettung Iteratoren zu flachen Iterator

Vereinfachtes Beispiel meines Code:

iter1 = iter([1,2]) 
iter2 = iter([3,4]) 
iter_list = [iter1, iter2] 
chained_iter = chain(iter_list) 

Wunschergebnis:

chained_iter.next() --> 1 
chained_iter.next() --> 2 
chained_iter.next() --> 3 
chained_iter.next() --> 4 

Tatsächliches Ergebnis:

chained_iter.next() --> <listiterator at 0x10f374650> 

Antwort

5

Sie wollen stattdessen itertools.chain.from_iterable() verwenden:

chained_iter = chain.from_iterable(iter_list) 

Sie haben eine einzelne iterable an chain() übergeben; Es ist entworfen, um die Elemente von multiple iterables zu nehmen und diese zu ketten. Es spielt keine Rolle, dass dieser einzelne Iterable mehr Iteratoren enthält.

Sie könnten auch diese Liste mit der * Syntax anwenden:

chained_iter = chain(*iter_list) 

, die für eine Liste funktioniert gut, aber wenn iter_list selbst, eine endlose Iterator war würden Sie wahrscheinlich wollen Python nicht versuchen, das erweitern in separate Argumente.

Demo:

>>> from itertools import chain 
>>> iter1 = iter([1, 2]) 
>>> iter2 = iter([3, 4]) 
>>> iter_list = [iter1, iter2] 
>>> chained_iter = chain.from_iterable(iter_list) 
>>> next(chained_iter) 
1 
>>> next(chained_iter) 
2 
>>> next(chained_iter) 
3 
>>> next(chained_iter) 
4 
0

Sie auf diese Weise versuchen:

>>> from itertools import chain 
>>> iter1 = iter([1,2]) 
>>> iter2 = iter([3,4]) 
>>> iter_list = [iter1, iter2] 
>>> chained_iter = chain(*iter_list) 
>>> next(chained_iter) 
1 
>>> next(chained_iter) 
2 
>>> next(chained_iter) 
3 
>>> next(chained_iter) 
4 
>>> 
Verwandte Themen