在具有嵌套列表的列表中查找每个级别的总和

Finding the sum of each level in a list with nested lists

提问人:john bilbrey 提问时间:11/3/2022 更新时间:11/4/2022 访问量:451

问:

我需要创建一个 python 函数,该函数接受一个数字列表(可能还有列表)并返回嵌套级别和该级别总和的列表。例如:

给定一个列表 [1,4,[3,[100]],3,2,[1,[101,1000],5],1,[7,9]] 我需要计算级别 0 上所有整数的值并将它们相加,然后计算级别 1 上的整数并将它们相加,依此类推,直到我找到最深嵌套级别的总和。

上面提到的示例列表的返回输出应为: [[0,11], [1,25], [2,1201]] 其中,每个列表中的第一个值是级别,第二个值是总和。我应该使用递归或while循环,而不导入任何模块。

我最初的想法是创建一个循环,遍历列表并找到任何整数(忽略嵌套列表),计算总和,然后从列表中删除这些整数,将下一个最高级别转换为整数,然后重复。但是,我找不到将列表中的列表转换为独立整数值的方法(本质上是删除第 0 级并将第 1 级变成新的第 0 级)。 我现在正在使用的代码如下:

def sl(lst,p=0):
    temp = []
    lvl = 0
    while lst:
        if type(lst[0]) == int:
            temp.append(lst[0])
            lst = lst[1:]
            return [lvl,sum(temp)]
        elif type(lst[0]) == list:
            lvl += 1
            return [lvl,sl(lst[1:],p=0)]

基本上,我创建了一个 while 循环来遍历、查找任何整数,并将其附加到一个临时列表中,然后在那里我可以找到总和。但是,我找不到一种方法来使循环访问下一个级别以执行相同的操作,尤其是当原始列表从左到右在级别上下移动时。

Python 循环递 总和 嵌套列表

评论


答:

1赞 MangoNrFive 11/4/2022 #1

我会这样做:

array = [1, 4, [3, [100]], 3, 2, [1, [101, 1000], 5], 1, [7, 9]]

sum_by_level = []
while array:
    numbers = (element for element in array if not isinstance(element, list))
    sum_by_level.append(sum(numbers))

    array = [element for list_element in array if isinstance(list_element, list) for element in list_element]

print(sum_by_level)
print(list(enumerate(sum_by_level)))

给出输出:

[11, 25, 1201]
[(0, 11), (1, 25), (2, 1201)]

因此,我将非列表元素相加,然后取列表元素并剥离外部列表。我重复此操作,直到数组为空,这意味着所有级别都被剥离了。我放弃了直接保存级别信息,因为它只是索引,但如果需要,您可以使用枚举(虽然提供元组而不是列表)。