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

Dan*_*ty2 10 python loops list python-3.x

鉴于以下列表

a = [0, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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

像这样:

b = [1, 3, 5]
Run Code Online (Sandbox Code Playgroud)

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

这是我尝试过的:

b = []
for i in a:
   b.append(a[i + 1] - a[i])
b
Run Code Online (Sandbox Code Playgroud)

问题是我一直收到这个错误:

IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

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

ill*_*ght 15

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

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

for i in range(len(a))
Run Code Online (Sandbox Code Playgroud)

并访问这样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]将意味着获得不存在的第六个元素.

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

  1. 有许多不同的方法来完成你在这里尝试做的事情.其中一些非常优雅,更像"pythonic",就像列表理解一样:

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

这只能在一行中完成.


K. *_*yah 5

将 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])
Run Code Online (Sandbox Code Playgroud)

这也可以写成列表理解

b = [a[i] + a[i+1] for i in range(len(a) - 1)]
Run Code Online (Sandbox Code Playgroud)