11

ネストされた要素のリストを合計しようとしています

例えば、numbers=[1,3,5,6,[7,8]]生成する必要がありますsum=30

私は次のコードを書きました:

def nested_sum(L):
    sum=0
    for i in range(len(L)):
       if (len(L[i])>1):
          sum=sum+nested_sum(L[i])
       else:
          sum=sum+L[i]
    return sum

上記のコードでは、次のエラーが発生します。

タイプ 'int' のオブジェクトには len() がありません

私も試しましたがlen([L[i]])、まだ機能していません。

誰でも助けることができますか?Python3.3です

4

14 に答える 14

30

isinstance要素がリストかどうかを確認するために使用する必要があります。また、物事を簡単にするために、実際のリストを反復処理することもできます。

def nested_sum(L):
    total = 0  # don't use `sum` as a variable name
    for i in L:
        if isinstance(i, list):  # checks if `i` is a list
            total += nested_sum(i)
        else:
            total += i
    return total
于 2013-02-17T01:29:07.293 に答える
6

一般に、明示的な型チェックよりも、 type をダックする方が Pythonic であると考えられています。このようなものは、リストだけでなく、イテラブルを取ります:

def nested_sum(a) :
    total = 0
    for item in a :
        try:
            total += item
        except TypeError:
            total += nested_sum(item)
    return total
于 2013-02-17T06:37:52.290 に答える
5

フラット化されたリストを合計します。

def flatten(L):
    '''Flattens nested lists or tuples with non-string items'''
    for item in L:
        try:
            for i in flatten(item):
                yield i
        except TypeError:
            yield item


>>> sum(flatten([1,3,5,6,[7,8]]))
30
于 2013-07-09T23:01:36.160 に答える
5

リスト内包表記を使用した代替ソリューションの 1 つ:

>>> sum( sum(x) if isinstance(x, list) else x for x in L )
30

編集:そして、2つ以上のレベルを持つリストの場合(thx @Volatility):

def nested_sum(L):
    return sum( nested_sum(x) if isinstance(x, list) else x for x in L )
于 2013-02-17T01:41:15.783 に答える
4

ラムダを使用してネストされたリストを処理する簡単な再帰:

rec = lambda x: sum(map(rec, x)) if isinstance(x, list) else x

rec、リストに適用されると、合計が(再帰的に)返され、値に適用されると、値が返されます。

result = rec(a)
于 2014-03-20T14:44:26.403 に答える
1

フィルターとマップと再帰を使用した例:

def islist(x): 
    return isinstance(x, list)

def notlist(x): 
    return not isinstance(x, list)

def nested_sum(seq):
    return sum(filter(notlist, seq)) + map(nested_sum, filter(islist, seq))

そして、これはreduceとrecursionを使用した例です

from functools import reduce


def nested_sum(seq):
    return reduce(lambda a,b: a+(nested_sum(b) if isinstance(b, list) else b), seq)

単純な古い再帰を使用した例:

def nested_sum(seq):
    if isinstance(seq[0], list):
        head = nested_sum(seq[0])
    else:
        head = seq[0]
    return head + nested_sum(seq[1:])

シミュレートされた再帰を使用した例:

def nested_sum(seq):
    stack = []
    stack.append(seq)
    result = 0
    while stack:
        item = stack.pop()
        if isinstance(item, list):
            for e in item:
                stack.append(e)
        else:
            result += item
    return result

自己参照リストを処理するための調整は、読者の課題として残されています。

于 2013-12-20T06:07:48.577 に答える
-2
    #nested sum

    l = [[1, 2], [3,5], [6,2], [4, 5, 6,9]] 

    def nested_sum(lst):

       sum = 0

       for i in lst:
          for j in i:
             sum = sum + j
       
       print(sum)
    
   
nested_sum(l) 
于 2021-02-17T20:43:26.830 に答える