【发布时间】:2015-07-16 17:57:41
【问题描述】:
这是我之前得到答案的转贴,但我只是不清楚语法,希望有人解释发生了什么,否则我将在这里记住“规则”。
此表达式按预期工作,但将矩阵中的每个字符返回到单个列表中:
[char for line in grid for i,char in enumerate(line) if len(line[i:])>3]
如果我想让矩阵中的每个字符保留在其对应的列表(或此处的行)中,我希望下面的代码能够工作(以保留循环展开顺序,其中内循环 [理解中最右边的循环]
[[char for line in grid] for i,char in enumerate(line) if len(line[i:])>3]
这给出了一个未定义的 NameError...所以我了解到适当的结构是:
[[char for i,char in enumerate(line) if len(line[i:])>3] for line in grid]
我一直在使用推导式,我想我只是还没有遇到过这个问题,所以它让我感到意外,但似乎在推导式中创建列表需要我们从本质上反转循环顺序,现在最右边的 for语句实际上首先执行,而不是从左边执行,或者从正常的 list comp 语法反转。
我在网上和书籍中找到了几个确认语法的示例(例如,对矩阵的每个元素求平方),但它们都掩盖了这样一个事实,即当使用列表在内部累积结果时 for 循环突然反转顺序理解。
鉴于上述情况,for 语句并不总是在理解中左/右执行,这是一个公平的说法吗?
【问题讨论】:
-
您能添加一些示例输入和预期输出吗?
-
不,您正在外部列表推导中执行新的列表推导,在任何列表推导中,for 语句始终从左到右执行
标签: python list nested list-comprehension