Python成语链(flatten)无限可迭代的有限迭代?

时间:2008-09-23 13:11:44

标签: python iterator

假设我们有一个返回列表(或有限迭代器)的迭代器(无限一个),例如由

返回的迭代器
infinite = itertools.cycle([[1,2,3]])

获取迭代器(显然是无限的)有什么好的Python习惯用法,它将从第一个迭代器返回每个元素,然后从第二个迭代器返回每个元素,等等。在上面的示例中,它将返回1,2,3,1,2,3,... 。迭代器是无限的,因此itertools.chain(*infinite)将不起作用。

相关

2 个答案:

答案 0 :(得分:43)

从Python 2.6开始,您可以使用itertools.chain.from_iterable

itertools.chain.from_iterable(iterables)

您也可以使用嵌套的生成器理解来执行此操作:

def flatten(iterables):
    return (elem for iterable in iterables for elem in iterable)

答案 1 :(得分:10)

使用发电机:

(item for it in infinite for item in it)

*构造解压缩成一个元组以传递参数,因此无法使用它。