一尘不染

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

python

给出以下列表

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


阅读 301

收藏
2020-12-20

共1个答案

一尘不染

  1. for循环中,您正在遍历list的元素a。但是在循环的主体中,当您实际需要索引时,将使用这些项目为该列表建立索引。
    想象一下,如果列表a包含5个项目,那么其中将包含100,并且for循环会到达该项目。您实际上将尝试检索列表的第100个元素,该元素a显然不存在。这会给你一个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]将获得不存在的第六个元素。

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

  1. 有多种方法可以完成您要在此处完成的工作。它们中的一些非常优雅,更加“ pythonic”,例如列表理解:

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

这只需要一行即可完成工作。

2020-12-20