2010-11-29 64 views
4

我在這裏給一個簡單的例子。假設我在Python中有一個迭代器,並且此迭代器返回的每個對象本身都是可迭代的。我想獲取這個迭代器返回的所有對象,並將它們連成一個長迭代器。是否有一個標準的實用程序來實現這一點?如果一個python迭代器返回可迭代的對象,我怎樣才能將這些對象鏈接成一個大的迭代器?

這是一個人爲的例子。

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

x是返回迭代器迭代器,我想鏈中的所有通過X返回到一個大的迭代的迭代器。在這個例子中這樣一個操作的結果應該是 相當於xrange(0,10),它應該被延遲評估。

+0

看來,Python是一個非常好的教學語言。 itertools方法沒有開始工作,直到我首先想到「老式」方式。我想它不想讓我走捷徑,直到我學到了很長的路。 – 2010-11-29 17:59:03

+0

嗯。這個問題是另一個重複:http://stackoverflow.com/questions/120886/python-idiom-to-chain-flatten-an-infinite-iterable-of-finite-iterables – 2010-11-30 05:01:05

回答

10

您可以使用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] 

如果這不是適用於您的版本(顯然,它在2.6的新功能),你可以做手工:

>>> 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

這裏的老式方式:

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] 
>>> 

我不確定使用的目的或好處iter()是,在這種情況下:

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