代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

如果python迭代器返回iterable对象,如何将这些对象链接到一个大型迭代器中?

  •  4
  • Ryan C. Thompson  · 技术社区  · 14 年前

    我在这里举一个简单的例子。假设我在python中有一个迭代器,这个迭代器返回的每个对象本身都是可迭代的。我想把这个迭代器返回的所有对象链接到一个长迭代器中。是否有一个标准实用程序来实现这一点?

    这里有一个人为的例子。

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

    x 是一个返回迭代器的迭代器,我想将x返回的所有迭代器链接到一个大型迭代器中。在本例中,这种操作的结果应该是 相当于xrange(0,10),应该惰性地评估它。

    2 回复  |  直到 14 年前
        1
  •  10
  •   aaronasterling    14 年前

    你可以用 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]
    
        2
  •  3
  •   John Machin Santi    14 年前

    这是老式的方法:

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