我在我正在处理的模块中找到了这段代码:
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
未定义,所有这些都失败了。
我该如何阅读?
(我怀疑在解释这个问题时我会感到非常尴尬。)
答案 0 :(得分:6)
这曾经让我很困惑。您应该像嵌套循环一样阅读它:
new_list = []
for y in l:
for x in y:
new_list.append(x)
变为
for y in l for x in y [do] new_list.append(x)
变为
[x for y in l for x in y]
答案 1 :(得分:5)
你应该把它读作:
for y in l:
for x in y:
yield x
这是生成器版本,但所有理解都具有相同的基本语法:虽然x
被放在前面,但表达式的其余部分仍然是从左到右读取的。我最初也对此感到困惑,期待它是另一种方式,但是一旦添加过滤表达式就有意义了:
>>> l = [[1,2,3,4,5], [1,"foo","bar"], [2,3]]
>>> [x for y in l
... if len(y) < 4
... for x in y
... if isinstance(x, int)]
[1, 2, 3]
现在想象不得不向后写这整个事情:
[x if isinstance(x, int)
for x in y
if len(y) < 4
for y in l]
即使对资深的Prolog程序员来说,这也会让人感到困惑,更不用说维护Python解析器的人了。)
当前语法也与Haskell中的语法相匹配,这首先启发了列表推导。
答案 2 :(得分:5)
来自list displays文档:
提供列表推导时,它包含一个表达式,后跟至少一个
for
子句和零个或多个for
或if
子句。在这种情况下,新列表的元素是通过将每个for
或if
子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。
因此,您的表达式可以重写为:
thingys = []
for y in l:
for x in y:
thingys.append(x)
答案 3 :(得分:1)
lis=[x for y in l for x in y] is Equivalent to:
lis=[]
for y in l:
for x in y:
lis.append(x)