1

重複の可能性:
Python でのリストのフラット化 (不規則な) リスト

リストを平坦化しようとしているときに、文字列を渡すと無限再帰に遭遇します。私の理解では、これは文字列の最初の要素が再び文字列であり、それを繰り返し処理できるために発生します。要素が文字列のように鳴るかどうかを確認することでこれを解決したため、2番目の例外が発生しました。これはかなり厄介なようです。また、本当の問題は、文字列には再帰に対する「基本ケース」がないという事実から生じます。このプロパティを持つ他のオブジェクトはありますか?

誰もがよりクリーンなソリューションを持っていますか?

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 に答える