总结嵌套列表

时间:2012-08-24 07:27:47

标签: python string recursion nested-lists

  

可能重复:
  Flatten (an irregular) list of lists in Python

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

有没有人有更清洁的解决方案?

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

提前致谢。对不起,如果有某个类似的帖子,但我找不到运气。

2 个答案:

答案 0 :(得分:1)

我相信这会做你想要的,也可以用字符串。

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

答案 1 :(得分:0)

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

def sum_messy_nest(l, current=0):
    for item in l:
        if isinstance(item, int) or isinstance(item, float):
            current += item
        elif isinstance(item, list):
            current += n(item, current)
        else:
            raise TypeError("I don't know this: {}".format(repr(item)))
    return current