2010-11-29 5 views
4

Ich gebe hier ein vereinfachtes Beispiel. Angenommen, ich habe einen Iterator in Python, und jedes Objekt, das dieser Iterator zurückgibt, ist selbst iterierbar. Ich möchte alle Objekte nehmen, die von diesem Iterator zurückgegeben werden, und sie zu einem langen Iterator zusammenfügen. Gibt es ein Standard-Dienstprogramm, um dies zu ermöglichen?Wenn ein Python-Iterator iterierbare Objekte zurückgibt, wie kann ich diese Objekte in einen großen Iterator ketten?

Hier ist ein künstliches Beispiel.

x = iter([ xrange(0,5), xrange(5,10)]) 

x ist ein Iterator, Iteratoren, und ich möchte Kette alle zurück Iteratoren von x zu einem großen Iterator zurückgibt. Das Ergebnis einer solchen Operation in diesem Beispiel sollte sein, das xrange (0,10) entspricht, und es sollte langsam ausgewertet werden.

+0

Es scheint, dass Python eine sehr gute Unterrichtssprache ist. Die Itertools-Methode hat nicht funktioniert, bis ich den "altmodischen" Weg zuerst herausgefunden habe. Ich nehme an, dass ich nicht wollte, dass ich die Abkürzung nehme, bis ich den langen Weg gelernt habe. –

+0

Hmm. Diese Frage ist ein Duplikat eines anderen: http://stackoverflow.com/questions/120886/python-idiom-to-chain-flatten-an-infinite-iterable-of-finite-iterables –

Antwort

10

können Sie verwenden itertools.chain.from_iterable

>>> import itertools 
>>> x = iter([ xrange(0,5), xrange(5,10)]) 
>>> a = itertools.chain.from_iterable(x) 
>>> list(a) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

Wenn das auf Ihrer Version nicht verfügbar ist (anscheinend, es ist neu in 2.6), können Sie es nur manuell:

>>> x = iter([ xrange(0,5), xrange(5,10)]) 
>>> a = (i for subiter in x for i in subiter) 
>>> list(a) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
3

Hier ist die altmodische weg:

Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from __future__ import generators 
>>> def mychain(iterables): 
...  for it in iterables: 
...   for item in it: 
...    yield item 
... 
>>> x = iter([ xrange(0,5), xrange(5,10)]) 
>>> a = mychain(x) 
>>> list(a) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> 

Ich bin mir nicht sicher, was der Zweck oder Nutzen der Verwendung iter() ist, in diesem Fall:

>>> x = [xrange(0,5), xrange(5,10)] 
>>> a = mychain(x) 
>>> list(a) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> 
+0

Nun, ich sagte, es war ein erfundenes Beispiel. Ich habe nur 'iter()' verwendet, um x zu einem Iterator anstelle einer einfachen Liste zu machen. Es gibt keinen wirklichen Vorteil. –

+0

Ich dachte, dass ich bereits den altmodischen Weg als zweiten Teil meiner Antwort gegeben habe. +1. Ich mag Archäologie. – aaronasterling

+0

@Ryan Thompson: s/Iterator/iterable/um Ihre Frage (und die Antworten) allgemeiner zu machen. –

Verwandte Themen