在Python中总结嵌套列表(不仅仅是int)

时间:2015-03-01 18:47:34

标签: python recursion sum nested-lists

我今天从学校得到了这个任务来制作一个函数Sum(list): 我研究并找到了几种方法如何使用包含int或整数列表的列表的列表,但是我的函数也应该与其他类型如字符串或元组一起使用。以下是它应该做的一些例子。

Sum([1,2,3]) returns 6;  Sum([2,[1.5,3],0.5]) returns 7.0;
Sum([[['p'],'yt'],['h',['on']]]) returns 'python'
Sum([[(1,2)],(3,),[(4,5)]])  returns (1, 2, 3, 4, 5);

除此之外,它还应该能够计算函数Sum(X)中的参数是否为NOT列表。例如:

Sum(5*5) returns 25;

到目前为止,这是我正在使用的工作,对于前2个案例工作正常,但是我无法找到修改它以便用于其他示例的方法。 Personaly一直试图使用isinstance和exception

def list_sum(L):
    total = 0  
    for i in L:
        if isinstance(i, list): 
            total += list_sum(i)
        else:
            total += i
    return total

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

使用第一个非列表值作为总和的初始值。让None表示我们还没有看到这样的价值:

def list_sum(L):
    if not isinstance(L, list):
        return L

    total = None
    for i in L:
        i = list_sum(i)

        if total is None:
            total = i
        else:
            total += i
    return total

此外,在这种情况下,使用isinstance是最安全的事情。


对于正确处理空列表的强大案例,请使用flattening generator

def list_sum(l):
    def flatten(l):
        for el in l:
            if isinstance(el, list):
                for sub in flatten(el):
                    yield sub
            else:
                yield el

    if isinstance(l, list):
        return sum(flatten(l))
    return l

请注意,内置sum函数适用于该情况。

答案 1 :(得分:0)

这是一个仅使用整数执行此操作的单行程序,以供将来参考:

from itertools import chain as flatten

def nested_sum(l):
    return sum(flatten.from_iterable(l))

itertools.chain非常适合展平嵌套的iterables。