【问题标题】:Facing an error "generator is not subscriptable" [duplicate]面临错误“生成器不可下标”[重复]
【发布时间】:2016-01-22 16:02:27
【问题描述】:

我实际上是在尝试创建一个函数来将二维列表向左或向右旋转 90°(它必须适用于 n 行和 n 列)。 我找到了一种使用两个循环“for”的方法,但它告诉我,当我尝试调用该函数时,生成器不可下标。 当我一个月前开始使用 Python 时,我对生成器是什么一无所知,我也不明白我在网上找到了什么。顺便说一句,由于语言的原因,我很难研究隐藏在其他帖子中的答案。

这是向右转的代码:

def Rotationversdroite(m,liste):
    i = 0
    x, y = 0, 0
    z = m - 1
    listebis = ([0]*(m) for i in range(m))
    for x in range(m):
        for y in range(m):
            listebis[y][z-x] = liste[x][y]
    return listebis

【问题讨论】:

  • 您的listebis 是一个生成器,当您希望它成为一个列表时。用括号替换括号。

标签: python list generator transpose


【解决方案1】:

您正在使用生成器表达式将生成器分配给listebis变量。

替换

listebis = ([0]*(m) for i in range(m))

列表理解

listebis = [[0] * m for i in range(m)]

【讨论】:

    【解决方案2】:

    简而言之,生成器用于迭代(通常用于循环)与列表或元组非常相似,但不会一次存储迭代的每个值,这样可以节省内存空间。

    当你写作时

    listebis = ([0]*(m) for i in range(m))
    

    它实际上并不执行循环并一次存储每个值,而是设置一个可以根据指定循环生成值的过程。

    要运行循环并将结果存储在列表中,请将行更改为以下之一:

    listebis = list([0]*(m) for i in range(m))
    listebis = [[0]*(m) for i in range(m)]      #square brackets instead of round
    

    附带说明,您不必初始化 i、x 或 y,因为它们将在各自的 for 循环开始时被初始化。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2011-03-26
      • 2020-08-18
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多