15

Pythonで2次元配列を合計したい:

ここに私が持っているものがあります:

def sum1(input):
    sum = 0
    for row in range (len(input)-1):
        for col in range(len(input[0])-1):
            sum = sum + input[row][col]

    return sum


print sum1([[1, 2],[3, 4],[5, 6]])

(1+2+3+4+5+6 = 21)4の代わりに表示されます。21私の間違いはどこですか?

4

13 に答える 13

49

私はこれがより良いと思います:

 >>> x=[[1, 2],[3, 4],[5, 6]]                                                   
>>> sum(sum(x,[]))                                                             
21
于 2012-11-27T06:07:33.340 に答える
36

その関数を次のように書き換えることができます。

def sum1(input):
    return sum(map(sum, input))

基本的に、map(sum, input)すべての行の合計を含むリストを返し、最も外側の行がそのリストを合計しますsum

例:

>>> a=[[1,2],[3,4]]
>>> sum(map(sum, a))
10
于 2012-05-23T03:58:07.720 に答える
10

そして、でこぼこした解決策は次のとおりです。

import numpy as np
x = np.array([[1, 2],[3, 4],[5, 6]])

結果:

>>> b=np.sum(x)
   print(b)
21
于 2012-05-23T03:50:33.013 に答える
9

これはさらに別の代替ソリューションです

In [1]: a=[[1, 2],[3, 4],[5, 6]]
In [2]: sum([sum(i) for i in a])
Out[2]: 21
于 2015-05-14T16:44:16.443 に答える
7

さらに良いことに、インデックス カウンターを忘れて、アイテム自体を反復処理します。

def sum1(input):
    my_sum = 0
    for row in input:
        my_sum += sum(row)
    return my_sum

print sum1([[1, 2],[3, 4],[5, 6]])

Python の優れた (そして慣用的な) 機能の 1 つは、Python にカウントを任せることです。sum()は組み込みであり、独自の識別子に組み込みの名前を使用しないでください。

于 2012-05-23T03:59:11.690 に答える
6

これが問題です

for row in range (len(input)-1):
    for col in range(len(input[0])-1):

試す

for row in range (len(input)):
    for col in range(len(input[0])):

Python の range(x) はすでに 0..x-1 になっています

range(...) range([start,] stop[, step]) -> 整数のリスト

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
These are exactly the valid indices for a list of 4 elements.
于 2012-05-23T03:45:12.467 に答える
1

range()in python は最後の要素を除外します。つまり、range(1, 5)[1, 5) または [1, 4] です。したがってlen(input)、行/列を反復処理するために使用する必要があります。

def sum1(input):
    sum = 0
    for row in range (len(input)):
        for col in range(len(input[0])):
            sum = sum + input[row][col]

    return sum
于 2012-05-23T03:45:21.920 に答える
1

range(len(input)-1) に -1 を入れないでください:

range(len(input))

range は自動的に引数値より 1 少ないリストを返すので、明示的に -1 を与える必要はありません

于 2012-05-23T03:46:45.803 に答える