避免生成嵌套迭代器,然后立即解压缩它们



在我正在处理的一些代码中,我正在处理生成许多需要组合的一级深度嵌套迭代器。作为一个有效的解决方案,我已经将这些部分中的每一个都包装在chain(*(one_level_nested))中(其中chain来自备受喜爱的 itertools 模块(。然而,重复这个表情几次让我觉得这个表情很丑陋,可能是误导;

作为一级深度生成代码的示例,其中大多数是按以下方式构造的:[j for j in something_needing_i(i)] for i in range(5)因此我最终得到chain(*([j for j in something_needing_i(i)] for i in range(5))).

有没有更好的方法,特别是在无需解包的情况下生成迭代器并且具有相当的效率(或理想情况下,效率更高(?

您可以只使用以下嵌套:

(j for i in range(5) for j in something_needing_i(i))

为了得到一台扁平的发电机。这也避免了虚假的中间列表,从而提高了空间效率。

两个for结构的顺序起初似乎违反直觉,因为与创建嵌套生成器/列表的构造相比,您必须将它们扭转过来。此外,它们的范围界定与我的自然语言"感觉"不符,但这就是它们的工作方式。

最新更新