【问题标题】:Why do I get "List index out of range" when trying to add consecutive numbers in a list using "for i in list"?Python循环:列表索引超出范围
【发布时间】:2016-10-03 20:13:53
【问题描述】:

给定以下列表

a = [0, 1, 2, 3]

我想创建一个新列表b,其中包含a 的当前值和下一个值相加的元素。它将包含比a1 个元素。

像这样:

b = [1, 3, 5]

(从 0+1、1+2 和 2+3)

这是我尝试过的:

b = []
for i in a:
   b.append(a[i + 1] - a[i])
b

问题是我不断收到此错误:

IndexError: list index out of range

我很确定它会发生,因为当我得到 (3) 的最后一个元素时,我无法将它添加到任何东西,因为这样做超出了它的价值(之后没有价值3 添加)。所以我需要告诉代码在 2 处停止,同时仍然参考 3 进行计算。

【问题讨论】:

  • 首先,您追加的行中的右括号在哪里?这应该给你一个SyntaxError

标签: python list loops python-3.x


【解决方案1】:
  1. 在您的for 循环中,您正在遍历列表a 的元素。但是在循环的主体中,当您真正需要索引时,您正在使用这些项目来索引该列表。
    想象一下,如果列表a 将包含 5 个项目,其中会包含一个数字 100,并且 for 循环会到达它。您实际上将尝试检索列表a 的第 100 个元素,这显然不存在。这会给你一个IndexError

我们可以通过迭代一系列索引来解决这个问题:

for i in range(len(a))

然后像这样访问a 的项目:a[i]。这不会给出任何错误。

  1. 在循环体中,您不仅要索引a[i],还要索引a[i+1]。这也是一个潜在错误的地方。如果您的列表包含 5 个项目,并且您像我在第 1 点中显示的那样对其进行迭代,您将得到一个 IndexError。为什么?因为range(5)本质上是0 1 2 3 4,所以当循环到达4时,你会尝试获取a[5]项。由于 Python 中的索引从 0 开始,并且您的列表包含 5 项,因此最后一项的索引为 4,因此获取 a[5] 将意味着获取不存在的第六个元素。

要解决这个问题,您应该从 len(a) 中减去 1 以获得范围序列 0 1 2 3。由于您使用的是索引i+1,因此您仍然会得到最后一个元素,但这样可以避免错误。

  1. 有许多不同的方法可以完成您在此处尝试执行的操作。其中一些非常优雅且更“pythonic”,例如列表推导:

b = [a[i] + a[i+1] for i in range(len(a) - 1)]

这仅在一行中完成。

【讨论】:

    【解决方案2】:

    尝试将 for 循环的范围缩小到range(len(a)-1)

    a = [0,1,2,3]
    b = []
    
    for i in range(len(a)-1):
        b.append(a[i]+a[i+1])
    
    print(b)
    

    这也可以写成list comprehension:

    b = [a[i] + a[i+1] for i in range(len(a)-1)]
    print(b)
    

    【讨论】:

      【解决方案3】:

      当您调用for i in a: 时,您得到的是实际元素,而不是索引。当我们到达最后一个元素,即3b.append(a[i+1]-a[i]) 寻找a[4],没有找到然后失败。相反,尝试迭代索引,同时在最后一个索引附近停止,例如

      for i in range(0, len(a)-1): Do something

      不过,您当前的代码还不能用于做某事;)

      【讨论】:

        【解决方案4】:

        您正在访问列表元素,然后使用它们尝试为您的列表建立索引。这不是一个好主意。您已经有了一个答案,显示了如何使用索引来获取总和列表,但另一个选择是 zip 带有自身切片的列表,这样您就可以对这些对进行求和。

        b = [i + j for i, j in zip(a, a[1:])]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-23
          • 2022-09-23
          • 2012-11-13
          • 1970-01-01
          • 1970-01-01
          • 2019-05-21
          • 1970-01-01
          • 2019-01-07
          相关资源
          最近更新 更多