首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数添加两个列表

函数添加两个列表
EN

Stack Overflow用户
提问于 2012-09-21 05:10:11
回答 7查看 2.7K关注 0票数 0

编辑:感谢你的回复,这些回复很有帮助,但我不确定它们是否解决了我的问题的核心。在某些情况下,简单地选择列表中较低的一个,然后相应地添加值会很好,但在这种情况下,我实际上希望处理不均匀的列表,就好像较短的列表缺少的值为零一样。所以我想让1,2,3+ 1,2作为函数。我不认为zip或颠倒我的运算符可以实现这一点。

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

代码语言:javascript
运行
复制
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])

但是我得到了一个错误,声明列表索引超出范围?不确定我在这个看似简单的程序中做错了什么……

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-09-21 05:12:15

你可能想改变这一行:

代码语言:javascript
运行
复制
if len(v1) > len(v2):

至:

代码语言:javascript
运行
复制
if len(v1) < len(v2):

这样,当v1较短时,您将迭代到v1中的元素数量,这将防止您越过边界。

请注意,这也会抛出一个错误,因为newVector是一个长度为0的列表,而您访问的内容超出了它的范围。你就得改变

代码语言:javascript
运行
复制
newVector[index] += v1[index] + v2[index]

代码语言:javascript
运行
复制
newVector.append(v1[index] + v2[index])

但是,请注意,这可以更简单地完成,如下所示:

代码语言:javascript
运行
复制
def addVectors(v1, v2):
    return map(sum, zip(v1, v2))

ETA:要用零填充列表,请执行以下操作:

代码语言:javascript
运行
复制
import itertools
def addVectors(v1, v2):
    return map(sum, itertools.izip_longest(v1, v2, fillvalue=0))

例如:

代码语言:javascript
运行
复制
addVectors([1, 2, 3, 4, 5], [1, 2])
# [2, 4, 3, 4, 5]
票数 7
EN

Stack Overflow用户

发布于 2012-09-21 05:12:45

为什么不直接用这个呢?

代码语言:javascript
运行
复制
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]
票数 4
EN

Stack Overflow用户

发布于 2012-09-21 05:13:15

您可以比较列表的长度,这是正确的。但随后您需要更改所需的操作。也就是说,当list1比list2长的时候,你应该只遍历list2长度的元素。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12520965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档