2

ネストされたすべてのリストの要素を合計していますが、これまでのところ、

for i in range(len(b)) :
    for j in range(len(b[i])):
        total = total + b[i][j]


ただし、次のようにネストされたリストに整数値が存在する場合、これは機能しません。

b = [[1,2], [3,4], [5,6], 1]


この場合、タイプ'int'のオブジェクトにlen()がないというエラーメッセージが表示されます。この場合はどうすればよいですか?

4

5 に答える 5

7

まず、Pythonプログラマーに共通のアンチパターンを示しています。インデックスをループせず、オブジェクト自体をループします。例えば:

for item in b:
    do_something(item)

それよりも:

for i in range(len(b)):
    do_something(b[i])

それはより明確で、より単純で、より速いです。

とはいえ、あなたが抱えている主な問題は、アイテムの1つがリストではないため、長さがないことです。

ここでのより良いオプションは、ジェネレータ式とでリストをフラット化してから組み込み関数itertools.chain.from_iterable()を使用して要素を合計することです。sum()

>>> import collections
>>> import itertools
>>> b = [[1,2], [3,4], [5,6], 1]
>>> list(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
[1, 2, 3, 4, 5, 6, 1]
>>> sum(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
22

反復不可能なアイテムを処理しないため、ジェネレータ式が必要なitertools.chain()ので、これを回避するためにリストに任意のアイテムを配置します。

別の方法は、独自のジェネレーターを作成することです。

def chain_mixed(iterable):
    for item in iterable:
        try:
            for subitem in item:
                yield subitem
        except TypeError:
            yield item

次に、次のことを簡単に行うことができます。

sum(chain_mixed(b))
于 2012-07-12T18:10:01.120 に答える
1

このようなものを試してくださいsum()。要素がまたはの場合にのみlist使用してください。それ以外のtuple場合は、数値を使用してください。

>>> b = [[1,2], [3,4], [5,6], 1]
>>> sum(sum(x) if isinstance(x,(list,tuple)) else x for x in b)
22

ソリューションの改善:

total=0
b = [[1,2], [3,4], [5,6], 1]
for i in range(len(b)) :
    if isinstance(b[i],(list,tuple)):
        for j in range(len(b[i])):
            total += b[i][j]
    else:
        total +=b[i]
print total  #prints 22
于 2012-07-12T18:10:44.600 に答える
1

発電機ベースのソリューション

>>> b = [[1,2], [3,4], [5,6], 1]
>>> def sum_up(x):
...     for i in x:
...             if isinstance(i, int):
...                     yield i
...             else:
...                     for j in sum_up(i):
...                             yield j
... 
>>> sum(sum_up(b))
22
>>> b = [[1,2], [3,4], [5,6,[3,[6,7]]], 1]
>>> sum(sum_up(b))
38
于 2012-07-12T18:23:56.510 に答える
0

それを行う1つの方法は

def calc_sum(the_list):
    sum = 0
    for item in the_list:
        if isinstance(item,(list,tuple)):
           sum += calc_sum(item)
        else:
           sum += item
    return sum

そのpythonicではありません...しかしそれは動作するはずです

于 2012-07-12T18:10:53.553 に答える
0

これを行う別の方法

これは、リストにネストされたリストと整数/浮動小数点数が含まれている場合に機能します。ここでは、Python組み込み関数「sum」を使用してリストのすべての要素を追加しました

def add(nested_list):
    temp=[]
    for i in nested_list:
        if isinstance(i,list):
            temp.append(sum(i))
        else:
            temp.append(i)
    print sum(temp)
于 2016-09-30T13:34:39.677 に答える