扁平化浅层嵌套列表的惯用法:它如何工作?


问题内容

我在正在处理的模块中找到了以下代码:

l = opaque_function()
thingys = [x for y in l for x in y]

我看不懂 通过实验,我可以确定它正在展平一个2级嵌套列表,但是syntex对我仍然是不透明的。很明显,它省略了一些可选的括号。

>>> l = [[1,2],[3,4]]
>>> [x for y in l for x in y]
[1, 2, 3, 4]

我的眼睛想将其解析为:[x for y in [l for x in y] ][ [x for y in l] for x in y ],但是由于y未定义,两者都失败了。

我应该如何阅读?

(我怀疑这被解释后会感到非常尴尬。)


问题答案:

列表中显示文档:

提供列表理解时,它由单个表达式组成,后接至少一个for子句和零个或多个fororif子句。在这种情况下,新列表的元素是通过将每个fororif子句视为一个块,从左到右嵌套,并在每次到达最里面的块时评估表达式以产生一个列表元素而生成的元素。

因此,您的表达式可以重写为:

thingys = []
for y in l:
    for x in y:
        thingys.append(x)