给出以下列表
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进行计算。
答案 0 :(得分:12)
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
,因此您仍然会获得最后一个元素,但这样可以避免错误。
b = [a[i] + a[i+1] for i in range(len(a) - 1)]
这只能在一行中完成。
答案 1 :(得分:2)
当您致电for i in a:
时,您将获得实际元素,而不是索引。当我们到达最后一个元素时,3
,b.append(a[i+1]-a[i])
查找a[4]
,找不到,然后失败。相反,尝试迭代索引,同时停止最后一个索引,如
for i in range(0, len(a)-1): Do something
您当前的代码虽然不能用于做某事;但
答案 2 :(得分: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 :(得分:1)
您正在访问列表元素,然后使用它们尝试索引列表。这不是一个好主意。您已经有一个答案显示如何使用索引来获取总和列表,但另一个选项是zip
列表中有一个自己的片段,以便您可以对这些对进行求和。
b = [i + j for i, j in zip(a, a[1:])]