Python 嵌套列表的求和

Python 嵌套列表的求和,python,string,recursion,nested-lists,Python,String,Recursion,Nested Lists,可能重复: 在尝试展平列表时,如果我传递字符串,就会遇到无限递归。据我所知,这是因为字符串的第一个元素也是字符串,而字符串又可以被迭代。我通过查看我的元素是否像字符串一样嘎嘎作响来解决这个问题,因此出现了第二个异常。这看起来相当混乱。此外,真正的问题来自字符串的递归没有“基本情况”。是否有其他具有此属性的对象 有人有更干净的解决方案吗 def nestedsum(lst, init_sum): for itm in lst: try: init_

可能重复:

在尝试展平列表时,如果我传递字符串,就会遇到无限递归。据我所知,这是因为字符串的第一个元素也是字符串,而字符串又可以被迭代。我通过查看我的元素是否像字符串一样嘎嘎作响来解决这个问题,因此出现了第二个异常。这看起来相当混乱。此外,真正的问题来自字符串的递归没有“基本情况”。是否有其他具有此属性的对象

有人有更干净的解决方案吗

def nestedsum(lst, init_sum):
    for itm in lst:
        try:
            init_sum +=itm
        except TypeError as e:
            #check if we have some string iterator
            # as this can cause infinite recurrsion
            try:
                itm + ''            
            except TypeError as e2:
                init_sum +=nestedsum(itm)             
            else:
                raise TypeError("Strings cannot be summed over")
    return init_sum

提前谢谢。很抱歉,如果某个地方有类似的帖子,但我没有幸运地找到它。

我相信这会满足您的需要,并且也适用于字符串

def nestedsum(lst, init_sum):
    for itm in lst:
        if isinstance(itm, (float, int)):
            init_sum += itm
        elif isinstance(itm, (tuple, list)):
            init_sum += nestedsum(itm, init_sum)
        else:
            continue
    return init_sum

我相信这将满足您的需要,并且也适用于字符串

def nestedsum(lst, init_sum):
    for itm in lst:
        if isinstance(itm, (float, int)):
            init_sum += itm
        elif isinstance(itm, (tuple, list)):
            init_sum += nestedsum(itm, init_sum)
        else:
            continue
    return init_sum

可能是更好的方法,但您可以使用
isinstance()
检查该项是否为列表


可能是更好的方法,但您可以使用
isinstance()
检查该项是否为列表


为什么不检查它是列表还是元组呢?你能测试一个对象是否是任何类型的数字吗?我认为这将有助于不提出任何例外情况,并在事后抓住任何例外情况。@jamylak谢谢,这确实回答了我的问题。谢谢你能展示一个输入和期望(或期望)输出的示例吗?我想我的问题应该更强调关于除了字符串之外是否还有其他iterable对象具有这种无限行为的部分。如果是这样的话,那么我应该把函数限制在我想要的特定的可重用项上。如果没有,那么我只检查我没有字符串。为什么不检查它是列表还是元组?你能测试一个对象是否是任何类型的数字吗?我认为这将有助于不提出任何例外情况,并在事后抓住任何例外情况。@jamylak谢谢,这确实回答了我的问题。谢谢你能展示一个输入和期望(或期望)输出的示例吗?我想我的问题应该更强调关于除了字符串之外是否还有其他iterable对象具有这种无限行为的部分。如果是这样的话,那么我应该把函数限制在我想要的特定的可重用项上。如果没有,那么我只是检查我没有字符串。