>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]]
>>> [a for d in my_list for c in d for b in c for a in b]
[1, 2, 3, 4, 5, 6]
相当于
>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]]
>>> new_list = []
>>> for d in my_list:
... for c in d:
... for b in c:
... for a in b:
... new_list.append(a)
... print(new_list):
[1, 2, 3, 4, 5, 6]
从左到右阅读时,此语法似乎倒退了。根据{{3}},“形式[... for x... for y...]
嵌套,最后一个索引变化最快,就像嵌套for循环一样。”是“正确的人”。
似乎选择了这个顺序(从左到右对应于外部到内部嵌套for循环),因为这是嵌套for循环的顺序。
但是,由于列表推导的表达式部分(上例中的a
),对应于嵌套循环最内部的表达式(上例中为new_list.append(a)
)在我看来,最接近这个表达式的for _ in _
在两种情况下应该是相同的,即它应该是for a in b
并且是向外的:
>>> my_list = [[[[1, 2, 3], [4, 5, 6], ]]]
>>> [a for a in b for b in c for c in d for d in my_list]
NameError: name 'b' is not defined
这样,最快变化的循环最接近动作,可以这么说。这也有助于以更加逻辑上逐步的方式从左到右阅读。
这是用户的普遍情绪吗?或者有没有人有一个很好的反驳,为什么当前的语法实现真的是“正确的”?
答案 0 :(得分:7)
考虑:
[leaf for branch in tree for leaf in branch]
它展开如下:
for branch in tree:
for leaf in branch:
yield leaf
如果我们用另一种方式写它
[leaf for leaf in branch for branch in tree]
在某种程度上用简单的英语可能更有意义,但可能的反驳是这里使用名称“branch”而没有(尚未)定义。