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
的当前值和下一个值相加的元素。它将包含比a
少1 个元素。
像这样:
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:
时,您得到的是实际元素,而不是索引。当我们到达最后一个元素,即3
,b.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循环:列表索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章