我需要编写两个函数来求嵌套数字列表的和,一个使用迭代,另一个使用递归.

我已经编写了两个函数,它们成功地找到了非嵌套数字列表的和,但我不确定如何让它们遍历嵌套列表.

这就是我到目前为止所拥有的:

def iterative_sum(ls:list):
    max = len(ls)
    i = 0
    num_sum = 0
    while i < max:
        
            num_sum += ls[i]
            i += 1
    return num_sum

def recursive_sum(ls:list):
    if len(ls)==0:
        return 0
    else:
        return ls[0] + recursive_sum(ls[1:])

num_list = [1, 5, 4, 3, 2, 10, 5]

print("Iterative sum:", iterative_sum(num_list))

print ("Recursive sum:", recursive_sum(num_list))

它对非嵌套列表非常有用,但如果我的列表也是这样的话,我需要它才能工作:

num_list = [1, 2, [3, 4], [5, [[6, 7], 8]], 9]

推荐答案

以下内容适用于任意嵌套的列表:

def iterative_sum(ls):
    # ls = ls[:]  # if you want it to be non-destructive
    s = 0
    while ls:
        last = ls.pop()
        if isinstance(last, int):
            s += last
        else:
            ls.extend(last)
    return s

>>> iterative_sum([1, 2, [3, 4], [5, [[6, 7], 8]], 9])
45

def recursive_sum(ls):
    if isinstance(ls, int):
        return ls
    # return sum(map(recursive_sum, ls))
    s = 0
    for x in ls:
        s += recursive_sum(x)
    return s

>>> recursive_sum([1, 2, [3, 4], [5, [[6, 7], 8]], 9])
45

和另一种使用递归而不需要任何迭代和切片的方法:

def recursive_sum(ls, i=0):
    if not isinstance(ls, list):
        return ls
    if i == len(ls):
        return 0
    return recursive_sum(ls[i]) + recursive_sum(ls, i+1)

Python相关问答推荐

Tokenizer Docker:无法为Tokenizer构建轮子,这是安装pyproject.toml项目所需的

取相框中一列的第二位数字

Python中MongoDB的BSON时间戳

列表上值总和最多为K(以O(log n))的最大元素数

未删除映射表的行

如何从具有不同len的列表字典中创建摘要表?

如果值不存在,列表理解返回列表

如何获取TFIDF Transformer中的值?

如果条件不满足,我如何获得掩码的第一个索引并获得None?

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

将输入聚合到统一词典中

在matplotlib中删除子图之间的间隙_mosaic

使用特定值作为引用替换数据框行上的值

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

基于行条件计算(pandas)

在Python中计算连续天数

如何在两列上groupBy,并使用pyspark计算每个分组列的平均总价值

为什么Python内存中的列表大小与文档不匹配?

判断Python操作:如何从字面上得到所有decorator ?

为什么t sns.barplot图例不显示所有值?'