【问题标题】:Python: Editing list while iterating over itPython:在迭代列表时编辑列表
【发布时间】:2019-01-09 01:04:25
【问题描述】:

Stack 上有一些相关的问题,但我想尽可能清楚。我正在使用 Python 3

如果我有一个列表,N,我使用以下代码:

N = [1,2,3,4,6,7,8]
for x in N:
    N[x] = N[x] * -1
return N

我收到了Index out of range error。我知道您不应该在迭代列表时添加和删除元素,但我想明确定义为什么上面的示例不起作用。对我来说,似乎不应该有问题。在第一次迭代中,x 应该评估为1。所以如果我想编辑N[1],我不明白为什么我不能。

附带说明,我知道enumerate() 是正确的做法。

【问题讨论】:

  • 你需要enumerate for x, value in enumerate(N):
  • 您需要更正代码中的缩进。
  • 您将for <elem> in <collection> 语法与for i in range(len(<coll>)): <coll>[i] 索引混合在一起,只选择了一个;>
  • 想一想你是否真的希望xfor 循环中拥有列表项的值?或者您希望 x 具有序列索引值。

标签: python iterator


【解决方案1】:

使用enumerate

例如:

N = [1,2,3,4,6,7,8]
for x, value in enumerate(N):
    N[x] = value * -1
print(N)

或列表推导式。

例如:

N = [x * -1 for x in N]

【讨论】:

  • N[x] = value * -1 怎么样?此外,令人困惑的是,x 是第一个中的索引,而第二个 sn-p 中的值。
  • @tobias_k。谢谢
【解决方案2】:

for x in N: 中,x 采用N 中的每个,然后您可以像使用索引一样使用它。 Python 中的列表是 0 索引的,因此当您到达列表末尾并尝试访问不存在的 N[8] 时,您会收到 Index out of range 错误。您可以改用for x in range(len(N)):

【讨论】:

    【解决方案3】:

    这里的问题实际上有点不同:您将列表的成员视为列表的索引。由于N[8] 不存在,这就是您的错误的来源。我想你的意思是:

    N = [1,2,3,4,6,7,8]
    for x in range(len(N)):
        N[x] = N[x] * -1
    return N
    

    【讨论】:

      【解决方案4】:

      在第一次迭代中,x=1 意味着N[1] 等于2,因此您的新N[1] 变为2 * -1 = -2。现在当x8 时,因为您使用的是for x in N,您的代码尝试访问N[8],但由于N 的长度为8,索引从0 开始并上升到@ 987654334@。因此没有索引8,因此您会收到错误Index out of range error

      【讨论】:

        【解决方案5】:

        使用 good ol' lambda's 或列表理解中的特定可调用对象:

        λ:

        N = [1,2,3,4,6,7,8]
        M = [(lambda x:-x)(element) for element in N]
        print(M)
        

        可调用/函数:

        def negate(x):
            return -x
        
        N = [1,2,3,4,6,7,8]
        M = [negate(element) for element in N]
        print(M)
        

        【讨论】:

          【解决方案6】:

          在您的代码中 -

          N = [1,2,3,4,6,7,8]
          for x in N: 
          # x will be 1, 2, 3, 4
          

          而您访问的方式是 -

          N[x]
          

          但索引从 0 到 n-1,其中 n-1 是最后一个元素。此外,在您的列表中,您缺少5,因此索引会发生严重变化。如果你有

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

          您的代码会运行良好。但既然情况并非如此,你必须使用range like -

          for i in range(len(N)):
              N[i] = N[i] * -1
          

          【讨论】:

            【解决方案7】:

            你的枚举方式不对

            N = [1,2,3,4,6,7,8]
            for i, x in enumerate(N):
                N[i] = N[i] * -1
            return N
            

            【讨论】:

            • 第二个例子没有改变列表。它只分配给变量x
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-08-11
            • 2018-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-24
            • 1970-01-01
            相关资源
            最近更新 更多