1

可能重复:
在 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

提前致谢。抱歉,如果某处有类似的帖子,但我没有运气找到它。

4

2 回答 2

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
于 2012-08-24T07:39:02.443 回答
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
于 2012-08-24T07:43:24.867 回答