33

させてdata = [[3,7,2],[1,4,5],[9,8,7]]

行列列に数値を追加して単一のリストを取得するように、リスト内の各リストのインデックスの要素を合計したいとします。データ内のすべてのリストの長さが等しいと想定しています。

    print foo(data)

   [[3,7,2],
    [1,4,5],
    [9,8,7]]
    _______
 >>>[13,19,14]

インデックスが範囲外のエラーになることなく、リストのリストを反復処理するにはどうすればよいですか?多分ラムダ?ありがとう!

4

10 に答える 10

75

あなたはこれを試すことができます:

In [9]: l = [[3,7,2],[1,4,5],[9,8,7]]

In [10]: [sum(i) for i in zip(*l)]
Out[10]: [13, 19, 14]

zipこれは、との組み合わせを*使用してリストを解凍し、インデックスに従ってアイテムを圧縮します。次に、リスト内包表記を使用して、類似したインデックスのグループを反復処理し、それらを合計して「元の」位置に戻します。

うまくいけば、もう少し明確にするために、これを繰り返したときに何が起こるかを示しますzip(*l)

In [13]: for i in zip(*l):
   ....:     print i
   ....:     
   ....:     
(3, 1, 9)
(7, 4, 8)
(2, 5, 7)

長さが等しくないリストの場合は、-で使用できます。itertools.izip_longestこれfillvalue0基本的に欠落しているインデックスを0で埋め、すべての「列」を合計できるようにします。

In [1]: import itertools

In [2]: l = [[3,7,2],[1,4],[9,8,7,10]]

In [3]: [sum(i) for i in itertools.izip_longest(*l, fillvalue=0)]
Out[3]: [13, 19, 9, 10]

この場合、反復処理はizip_longest次のようになります。

In [4]: for i in itertools.izip_longest(*l, fillvalue=0):
   ...:     print i
   ...:     
(3, 1, 9)
(7, 4, 8)
(2, 0, 7)
(0, 0, 10)
于 2012-12-09T00:18:27.987 に答える
13

行列(または他の野心的な数値)演算については、NumPyを調べることをお勧めします。

質問に示されている軸に沿った配列の合計を解くためのサンプルは次のとおりです。

>>> from numpy import array
>>> data = array([[3,7,2],
...     [1,4,5],
...     [9,8,7]])
>>> from numpy import sum
>>> sum(data, 0)
array([13, 19, 14])

合計関数に関するnumpyのドキュメントは次のとおりです。http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum

特に2番目の引数は、合計する必要があるものを簡単に指定できるため、興味深いものです。すべての要素、または潜在的にn次元の配列(のような)の特定の軸のみです。

于 2012-12-09T00:15:54.090 に答える
11

これにより、各サブリストの合計が得られます

data = [[3,7,2],[1,4],[9,8,7,10]]
list(map(sum, data))
[12, 5, 34]

すべての要素を合計して1つの合計だけを取得する場合は、これを使用します

data = [[3,7,2],[1,4],[9,8,7,10]]
sum(sum(data, []))
51
于 2013-07-14T13:04:49.420 に答える
2
>>> data = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> for column in enumerate(data[0]):
...     count = sum([x[column[0]] for x in data])
...     print 'Column %s: %d' % (column[0], count)
... 
Column 0: 3
Column 1: 6
Column 2: 9
于 2012-12-09T00:17:39.070 に答える
0

これは、すべての内部リスト(または行)が同じ長さであるという仮定に依存しますが、必要なことを実行する必要があります。

sum_list = []

ncols = len(data[0])

for col in range(ncols):
    sum_list.append(sum(row[col] for row in data))


sum_list
Out[9]: [13, 19, 14]
于 2012-12-09T00:15:18.783 に答える
0
def sum(L):
res = list()
for j in range(0,len(L[0])):
    tmp = 0
    for i in range(0,len(L)):
        tmp = tmp + L[i][j]
    res.append(tmp)
return res
于 2014-06-19T13:27:27.927 に答える
0
numArr = [[12, 4], [1], [2, 3]]

sumArr = 0

sumArr = sum(sum(row) for row in numArr)

print(sumArr) 

the answere: 22

私がしたこと:たとえば、次のように「for」を実行すると、[row.append(1)for row in numArr]リストは次のように変更されます:[[12、4、1]、[1、1]、[2 、3、1]] pythonの関数sum()を使用しました。この関数はリストを取得し、それを反復処理して、リスト内のすべての数値の合計を取得します。sum(sum())を実行すると、ビッグリスト内のすべてのリストの合計が得られました。

于 2019-03-24T10:18:01.123 に答える
0

このソリューションは、正方行列を想定し、2つのforループを使用して列と行をループし、プロセスで列ごとに追加します。結果はリストに返されます。

def foo(data):
    # initialise length of data(n) and sum_of_col variable 
    n = len(data)
    sum_of_col = []

    # iterate over column
    for col_i in range(n):
        # column sum
        col_count = 0;

        #iterate over row
        for row_i in range(n):
            col_count += data[row_i][col_i]

        # append sum of column to list    
        sum_of_col.append(col_count)

    return sum_of_col
于 2019-10-11T06:00:21.973 に答える
0

異なるまたは同一の長さのリストのリストを合計する最も簡単なソリューションは次のとおりです。

total = 0
for d in data:
    total += sum(d)

リスト内包表記を理解したら、それを短くすることができます。

sum([sum(d) for d in data])
于 2019-10-11T06:13:22.687 に答える
0

データが文字列のリストのリストである場合。文字列のリストのリストを要素ごとに合計または連結します。

>>> a = [list('abc'),list('def'),list('tyu')]
>>> a
[['a', 'b', 'c'], ['d', 'e', 'f'], ['t', 'y', 'u']]
>>> [''.join(thing) for thing in zip(*a)]
['adt', 'bey', 'cfu']
>>> 
于 2020-01-05T18:04:34.070 に答える