功能添加两个列表

时间:2012-09-20 21:10:11

标签: python

编辑:感谢您的回复,这些回复很有帮助,但我不确定他们是否解决了我的问题。在某些情况下,简单地选择列表中较低的列表然后相应地添加值会很好,但在这种情况下,我实际上想要处理不均匀的列表,就好像较短的列表对于缺少的值具有零值。所以我希望[1,2,3] + [1,2]起到[1,2,3] + [1,2,0]的作用。我认为拉链或反转我的操作员不会实现这一点。

我正在尝试创建一个函数,该函数添加两个列表的相应值,并返回一个新列表,其中包含两个原始列表的每个索引的总和:

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

然而,我收到一条错误,指出列表索引超出范围?不知道我在这个看似简单的程序中做错了什么......

7 个答案:

答案 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