我正在尝试创建一个函数,该函数添加两个列表的相应值,并返回一个新列表,其中包含两个原始列表的每个索引的总和:
def addVectors(v1, v2):
print(v1[0], v1[1], v2[0])
newVector = []
if len(v1) > len(v2):
for index in range(len(v1)):
print(index)
newVector[index] += v1[index] + v2[index]
else:
for index in range(len(v2)):
print(index)
newVector[index] += v2[index] + v1[index]
return newVector
addVectors([1, 2, 3], [1, 2])
然而,我收到一条错误,指出列表索引超出范围?不知道我在这个看似简单的程序中做错了什么......
答案 0 :(得分:6)
你可能想改变这一行:
if len(v1) > len(v2):
为:
if len(v1) < len(v2):
这样,当v1更短时,你将迭代到v1 中的元素数量,这会阻止你越过边缘。
请注意,这将也抛出错误,因为newVector
是一个长度为0的列表,并且您正在其范围之外访问。你必须改变
newVector[index] += v1[index] + v2[index]
到
newVector.append(v1[index] + v2[index])
但请注意,这可以更简单地完成很多:
def addVectors(v1, v2):
return map(sum, zip(v1, v2))
ETA:要用零填充列表,请执行:
import itertools
def addVectors(v1, v2):
return map(sum, itertools.izip_longest(v1, v2, fillvalue=0))
例如:
addVectors([1, 2, 3, 4, 5], [1, 2])
# [2, 4, 3, 4, 5]
答案 1 :(得分:4)
为什么不直接使用它?
def sum_lists(a, b):
return [x[0] + x[1] for x in zip(a, b)]
sum_lists([1, 2, 3], [4, 5, 6]) # -> [5, 7, 9]
答案 2 :(得分:2)
您可以比较列表的长度,这是正确的。但是,然后您更改了所需的操作。即当list1比list2长时,你应该只循环遍历 list2 长度的元素。
答案 3 :(得分:2)
要填写不均匀长度的列表,您可以使用itertools
:
>>> import itertools
>>> map(sum, itertools.izip_longest([1,2,3], [1,2], fillvalue = 0))
[2, 4, 3]
答案 4 :(得分:1)
你的问题在于:
if len(v1) > len(v2):
for index in range(len(v1)):
print(index)
newVector[index] += v1[index] + v2[index]
您确保len(v1) > len(v2)
,然后迭代range(len(v1))
。
在您的示例中,您尝试访问不存在的v2[2]
。
更新:
为了响应您的编辑,您可以使用以下内容:
def addVectors(v1, v2):
if len(v1) > len(v2):
map(sum, zip(v1, v2)).extend(v1[len(v2):])
else:
map(sum, zip(v1, v2)).extend(v2[len(v1):])
答案 5 :(得分:0)
您的IndexError是因为当newVector为空列表时,您尝试写入newVector [index]。您需要将其初始化为一堆零,或者使用append代替。
>>> first = [1,2,3]
>>> second = [1,2]
>>> output = []
>>> for i, item in enumerate(first):
... additional = second[i] if i < len(second) else 0
... output.append(item + additional)
...
>>> output
[2, 4, 3]
并确保len(第一个)&gt; len(第二个),你可以这样做:
first, second = first, second if len(first) > len(second) else second, first
答案 6 :(得分:0)
或者您可以尝试
def add_vector(vector1, vector2):
index = len(vector1) - 1
new = []
while index >= 0:
result = vector1[index] + vector2[index]
new.append(result)
index -=1
new.reverse()
return new