Python中用于链接(展平)无限可迭代的有限可迭代对象的惯用法是什么?

28
假设我们有一个迭代器(无限的),它返回列表(或有限迭代器),例如由以下代码返回的迭代器:
infinite = itertools.cycle([[1,2,3]])

注意:这不是仅仅将嵌套列表展平的问题——尝试详尽处理列表的解决方案无法工作,例如[item for sublist in infinite for item in sublist]会耗尽内存。

有没有一个好的Python惯用语来获取一个迭代器(显然是无限的),它将返回第一个迭代器中的每个元素,然后是第二个迭代器中的每个元素,以此类推。在上面的例子中,它将返回1,2,3,1,2,3,...。由于迭代器是无限的,因此itertools.chain(*infinite)将无法工作。

相关

2个回答

55

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

我可以用 ';' 连接列表吗? - diffracteD
@diffracteD - 加入无限数量的项目?不是真的。 - Mr_and_Mrs_D

13

使用生成器:

(item for it in infinite for item in it)

*号构造被展开为元组,以便传递参数,因此无法使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接