【问题标题】:If a python iterator returns iterable objects, how can I chain those objects into one big iterator?如果 python 迭代器返回可迭代对象,我如何将这些对象链接到一个大迭代器中?
【发布时间】:2011-05-17 04:13:53
【问题描述】:

我将在这里给出一个简化的例子。假设我在 python 中有一个迭代器,并且这个迭代器返回的每个对象本身都是可迭代的。我想获取此迭代器返回的所有对象并将它们链接到一个长迭代器中。是否有标准实用程序可以实现这一点?

这是一个人为的例子。

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

x 是一个返回迭代器的迭代器,我想将 x 返回的所有迭代器链接成一个大迭代器。在这个例子中这样一个操作的结果应该是 相当于 xrange(0,10),它应该被惰性求值。

【问题讨论】:

  • 看来Python是一门很好的教学语言。 itertools 方法直到我首先弄清楚“老式”方法才开始工作。我猜它不想让我走捷径,直到我学会了长路。
  • 嗯。这个问题与另一个问题重复:stackoverflow.com/questions/120886/…

标签: python iterator lazy-evaluation


【解决方案1】:

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

    这是老式的方法:

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

    【讨论】:

    • 好吧,我说这是一个人为的例子。我只是使用iter() 将 x 变成了一个迭代器,而不是一个简单的列表。没有实际的好处。
    • 我以为我已经给出了老式的方法作为答案的第二部分。 +1。我喜欢考古学。
    • @Ryan Thompson: s/iterator/iterable/ 让您的问题(和答案)更笼统。
    • @aaron sterling:我喜欢 AK47 考古:dos_prompt> for %v in (1 2 3 4 5 6 7) do \python2%v\python -c "yield 1" 并注意错误信息的变化 :-)
    • 我专门询问迭代器,因为真正的问题是在保持懒惰的同时做我想做的事,因为我需要迭代的东西很大并且不适合内存。我的理解是迭代器是惰性求值的可迭代对象,这就是我询问迭代器的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多