为什么在尝试使用“for i in list”在列表中添加连续数字时出现“List index out of range”?

新手上路,请多包涵

给出以下列表

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])

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

IndexError:列表索引超出范围

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

原文由 Dance Party2 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 581
2 个回答
  1. 在您的 for 循环中,您正在遍历列表的元素 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] 将意味着获取不存在的第六个元素。

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

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

这只在一行中完成工作。

原文由 illright 发布,翻译遵循 CC BY-SA 4.0 许可协议

将 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])

这也可以写成 列表理解

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

原文由 K. Menyah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题