【问题标题】:Why this statement doesnt work?为什么这个说法不起作用?
【发布时间】:2014-03-24 08:20:22
【问题描述】:

为什么下面的列表理解表达式不起作用?

[col1*col2 for (col1, col2) in zip(row1, row2) for (row1, row2) in zip(M,N)]

Python 说:

NameError: name 'row1' is not defined

与:

M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
N = [[2, 2, 2], [3, 3, 3], [4, 4, 4]]

【问题讨论】:

  • 您在告诉解释器之前引用了row1row2
  • [col1*col2 for (row1, row2) in zip(M,N) for (col1, col2) in zip(row1, row2)] 试试这个理解
  • 啊,我明白了,for 语句应该按倒序排列。谢谢
  • @jAckOdE 实际上是 you 向后编写了循环。列表理解的想法是[x for y in A for z in B] 代表循环:for y in A: for z in B: the_list.append(x)。不知道为什么您认为等效语句应该交换循环。
  • @Bakuriu 因为与循环相比,整个事情是交换的,所以人们可能会想在理解中嵌套for 语句的顺序也是一样的。

标签: python


【解决方案1】:

确实,row1 没有定义,row2 也是如此。

让我们简化您实际尝试做的事情:

for row1, row2 in zip(M, N):
    for col1, col2 in zip(row1, row2):
        result = col1*col2
        print result

上面的代码运行良好,因为我们首先从zip(M, N) 中选择了row1row2。然后我们从zip(row1, row2)中选择了col1col2

因此,如果您想在一行中压缩代码,您必须遵循与上述相同的方法。因此您的代码将如下所示:

[col1*col2 for (row1, row2) in zip(M, N) for (col1, col2) in zip(row1, row2)]

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多