在我正在处理的一些代码中,我正在处理生成许多需要组合的单层深度嵌套迭代器。作为一个可行的解决方案,我将所有这些部分都包装在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)))
结尾。
是否有更好的方法,特别是在不进行拆包的情况下生成迭代器并具有可比的效率(或者理想情况下,效率更高)?
答案 0 :(得分:3)
您可以仅使用以下嵌套:
(j for i in range(5) for j in something_needing_i(i))
以获取平板发电机。这也避免了虚假的中间列表,从而提高了空间效率。
两个for
构造的顺序乍看起来似乎违反直觉,因为与创建嵌套生成器/列表的构造相比,您必须将它们转过来。另外,他们的范围与我的自然语言“感觉”不符,但这就是他们的工作方式。