2012-05-23 110 views
8

我要總結在python 2維數組:如何在Python中求和2d數組?

這是我有:

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]]) 

它顯示4代替21(1 + 2 + 3 + 4 + 5 + 6 = 21)。我的錯誤在哪裏?

+0

'減少(拉姆達X,Y:X +總和(Y),[[1,2] ,[3,4],[5,6]],0)':-)。但是,是的,問題在其他人指出的範圍內。 – Vikas

回答

4

這是問題

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的範圍(X)從0..X-1已經

範圍(...) 去範圍([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. 
1

range()在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 
1

不要把-1範圍(LEN(輸入)-1),而不是使用:

range(len(input)) 

範圍內自動返回一個列表比參數值,所以沒必要明確地給出一個都不能少-1

3

您可以使用遞歸的解決方案:

def sum_up(x): 
    my_sum = 0 
    for ele in x: 
     if isinstance(ele, int): 
      my_sum += ele 
     elif isinstance(ele, list): 
      my_sum += sum_up(ele) 
    return my_sum 

結果:

>>> sum_up([[1, 2],[3, 4],[5, 6]]) 
21 
>>> sum_up([[[2,2],2,[[3,2],1]]]) 
12 

而且numpy的解決方案就是:

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

結果:

>>> np.sum(x) 
21 
+2

如果你發現你正在使用'isinstance'來解決這個問題,那麼你可能想用強類型的方式來思考。這是一個過於複雜的答案。 – msw

+0

@msw,真的,但使用遞歸這種方式有其優點,因爲它更靈活,因爲我表明它適用於任何奇怪的列表形式。但至少我的答案的另一部分很簡單:)。 – Akavall

+0

確實更靈活。我發現在stackoverflow和編碼中,過度的靈活性有時是一種負擔。例如,我寧願看到sum([1,[2,3]])引發TypeError,而不是猜測我想要的結果。這對於SO的新手問題尤其重要。 – msw

17

你可以重寫功能,

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

基本上,map(sum, input)會返回一個列表與跨所有行的總和,然後是外部大多數sum會將該列表加起來。

例子:

>>> a=[[1,2],[3,4]] 
>>> sum(map(sum, a)) 
10 
5

更妙的是,忘記了指數計數器,只是遍歷項目本身:

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中的尼斯(地道)的特點是讓它做爲你計數。 sum()是內置的,您不應該爲自己的標識符使用內置名稱。

12

我認爲這是更好:

>>> x=[[1, 2],[3, 4],[5, 6]]             
>>> sum(sum(x,[]))                
21 
+1

最短的解決方案!爲什麼沒有人投票呢? – BachT

+0

最短的解決方案,它的工作原理! –

+0

不僅是最短的,而且它是不可變的(!!!) – juanchito

2

這是又一個可替代解決方案

In [1]: a=[[1, 2],[3, 4],[5, 6]] 
In [2]: sum([sum(i) for i in a]) 
Out[2]: 21 
+0

best sol'n overall !!! – juanchito