我正在创建一个程序,在两个单独的列表中添加相同基数的元素:
list1 = [1,2,3]
list2 = [2,3,4]
因此list3
将为[3,5,7]
这是我的代码:
def add_list(lst1,lst2):
sum_lst = []
index = 0
while (len(lst1)-1) >= index:
sum_lst[index] == lst1[index] + lst2[index]
index += 1
return sum_lst
运行时我收到此错误“索引超出范围”:
sum_lst[index] == lst1[index] + lst2[index]
考虑到我在超过列表长度之前停止索引,它是如何超出范围的?
答案 0 :(得分:6)
sum_lst[index] == lst1[index] + lst2[index]
^1 ^2
2个主要问题:
==
与=
不同。 ==
是一个布尔表达式操作,用于评估相等性,而=
是赋值运算符。两个修正:
#replaces that one line
sum_lst.append(lst1[index]+lst2[index])
OR
#replaces the whole function
sum_lst = [x+y for x,y in zip(lst1,lst2)]
答案 1 :(得分:3)
您在错误讯息中遇到错误的原因是因为sum_lst
还没有您正在寻找的索引。
E.g。如果你试试
>>> some_list = []
>>> some_list[0] = 1 # you'll get
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
相反,尝试类似:
sum_lst.append(lst1[index] + lst2[index])
这将在数组的末尾添加一个新元素
答案 2 :(得分:0)
这条线的问题已经指出:
sum_lst[index] == lst1[index] + lst2[index]
除了此修复程序之外,我将解释您可以采取的一些步骤来改进此代码和类似代码。
通常在Python中使用while
循环,而不是递增索引并使用for
循环。我们可以使用range
函数遍历所有索引。
以下是一项改进(请注意我们在此修复了append
和==
问题):
def add_list(lst1, lst2):
sum_lst = []
for index in range(len(lst1)):
sum_lst.append(lst1[index] + lst2[index])
return sum_lst
但这仍然不是惯用的。
在检索索引时,使用enumerate
函数循环遍历项目会更好。每当您看到类似for i in range(len(lst1))
的内容时enumerate
。
def add_list(lst1, lst2):
sum_lst = []
for index, item1 in enumerate(lst1):
sum_lst.append(item1 + lst2[index])
return sum_lst
我们需要索引的唯一原因是因为我们试图一次遍历两个列表。每当您需要同时遍历多个列表时,您可以使用zip
函数将迭代/列表压缩在一起:
def add_list(lst1, lst2):
sum_lst = []
for item1, item2 in zip(lst1, lst2):
sum_lst.append(item1 + item2)
return sum_lst
这几乎是我们能做的最好的事情。我们可以做出另外一项改进:使用列表理解而不是for
循环:
def add_list(lst1, lst2):
return [item1 + item2 for item1, item2 in zip(lst1, lst2)]
答案 3 :(得分:-2)
>>> [a+b for a,b in zip(list1,list2)]
[3, 5, 7]
我会说你的代码的主要问题不是bug本身,而是你用传统的程序模式编写。也许你曾经做过Java或C? Python是一种多范式语言,支持函数式编程。主要的好处是你应该尝试保持不可变的内容,因此不是创建空列表并逐渐用内容填充它们,而是尝试动态创建结果列表。如上例所示。这样,您就无法在赋值运算符的任何一侧产生索引错误。
但是,如果你真的想知道,你的错误是双重的:
>>> a = []
>>> a[1] = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
即。您无法通过分配新元素将内容附加到列表中。你可以这样做:
a += [3]
其次,您使用了比较运算符(==
)而不是赋值运算符(=
)。