Python循环:列表索引超出范围

时间:2016-06-03 17:00:29

标签: python list loops python-3.x

给出以下列表

a = [0, 1, 2, 3]

我想创建一个新列表b,其中包含对a的当前值和下一个值求和的元素。它将包含 1 少于a的元素。

像这样:

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进行计算。

4 个答案:

答案 0 :(得分:12)

  1. for循环中,您将遍历列表a的元素。但是在循环体中,当您真正想要索引时,您正在使用这些项来索引该列表 想象一下,如果列表a将包含5个项目,则其中将包含数字100,并且for循环将到达它。您将基本上尝试检索列表a的第100个元素,这显然不存在。这将为您提供IndexError
  2. 我们可以通过迭代一系列索引来解决这个问题:

    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]将意味着获得不存在的第六个元素。
    2. 要解决此问题,您应该从len(a)中减去1,以获得范围序列0 1 2 3。由于您使用的是索引i+1,因此您仍然会获得最后一个元素,但这样可以避免错误。

      1. 有很多不同的方法来完成你在这里尝试做的事情。其中一些非常优雅,更像“pythonic”,如列表理解:
      2. b = [a[i] + a[i+1] for i in range(len(a) - 1)]

        这只能在一行中完成。

答案 1 :(得分:2)

当您致电for i in a:时,您将获得实际元素,而不是索引。当我们到达最后一个元素时,3b.append(a[i+1]-a[i])查找a[4],找不到,然后失败。相反,尝试迭代索引,同时停止最后一个索引,如

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

您当前的代码虽然不能用于做某事;但

答案 2 :(得分: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 :(得分:1)

您正在访问列表元素,然后使用它们尝试索引列表。这不是一个好主意。您已经有一个答案显示如何使用索引来获取总和列表,但另一个选项是zip列表中有一个自己的片段,以便您可以对这些对进行求和。

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