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

Posted

技术标签:

【中文标题】Python循环:列表索引超出范围【英文标题】:Why do I get "List index out of range" when trying to add consecutive numbers in a list using "for i in list"? 【发布时间】: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 【参考方案1】:
    在您的for 循环中,您正在遍历列表a 的元素。但是在循环的主体中,当您真正需要索引时,您正在使用这些项目来索引该列表。 想象一下,如果列表a 将包含 5 个项目,其中会包含一个数字 100,并且 for 循环会到达它。您实际上将尝试检索列表a 的第 100 个元素,这显然不存在。这会给你一个IndexError

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

for i in range(len(a))

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

    在循环体中,您不仅要索引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,因此您仍然会得到最后一个元素,但这样可以避免错误。

    有许多不同的方法可以完成您在此处尝试执行的操作。其中一些非常优雅且更“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:])]

【讨论】:

以上是关于Python循环:列表索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

简单python for循环上的列表索引超出范围错误

Networkx:通过循环遍历节点列表添加属性时,IndexError:列表索引超出范围

Python - 索引错误 - 列表索引超出范围

当我遍历我的列表时,返回列表索引超出范围

Python:IndexError:列表索引超出范围

IndexError:列表索引超出范围 - python 错误