【问题标题】:sum two lists element-by-element in python recursively [duplicate]递归地在python中逐个元素地对两个列表求和[重复]
【发布时间】:2014-05-18 13:34:50
【问题描述】:

是否可以逐个元素递归地对两个列表求和,然后返回新列表?

def sumListElements(listOne, listTwo):
    list = []
    i = 0
    while i < len(listOne):
        list.append(listOne[i] + listTwo[i])
        i += 1
    return list

所以,

a = [1, 2, 3]
b = [3, 4, 5]

结果

R = [4, 6, 8]

【问题讨论】:

  • 为什么要递归?这里没有嵌套结构。

标签: python arrays list recursion


【解决方案1】:

在此处使用zip()map()

R = map(sum, zip(a, b))

演示:

>>> a = [1, 2, 3]
>>> b = [3, 4, 5]
>>> map(sum, zip(a, b))
[4, 6, 8]

为了兼容 Python 3,请将 map() 替换为列表解析:

[sum(z) for z in zip(a, b)]

【讨论】:

  • 那么,这是唯一的方法吗?
  • 不,这是最有效的方法。
  • 我喜欢高效的方式,但我必须递归地编写它,就像@thefourtheye 完成的那样。
【解决方案2】:

函数接受 n 个列表,并将第 i 个索引中的每个元素与其他元素相加:

from itertools import izip_longest

def sum_elements(*lists):
    return map(sum, izip_longest(*lists, fillvalue=0))

与您的数据一起显示:

>>> sum_elements([1, 2, 3], [3, 4, 5])
[4, 6, 8]

长度不均匀的列表仍然有很好的结果:

>>> sum_elements([1, 2, 3], [3, 4, 5, 6])
[4, 6, 8, 6]

它可以接受任意数量的列表:

>>> sum_elements([1, 2, 3], [3, 4, 5, 6], [8,9])
[12, 15, 8, 6]

【讨论】:

    【解决方案3】:

    这是一个递归实现

    def recursive_sum(l1, l2, idx = 0):
        if idx < min(len(l1), len(l2)):
            return [l1[idx] + l2[idx]] + recursive_sum(l1, l2, idx + 1)
        else:
            return []
    
    print recursive_sum([1, 2, 3], [4, 5, 6])
    # [5, 7, 9]
    

    或者

    def recursive_sum(l1, l2, result = None, idx = 0):
        if result is None:
            result = []
        if idx < min(len(l1), len(l2)):
            result.append(l1[idx] + l2[idx])
            return recursive_sum(l1, l2, result, idx + 1)
        else:
            return result
    

    【讨论】:

    • @Xerath 确保在你的作业中找到这个答案......
    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多