2012-12-09 119 views
19

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] 

如何迭代列表的列表而不使索引超出範圍錯誤?也許lambda?謝謝!

+0

[你有什麼嘗試?](http://whathaveyoutried.com/) –

回答

51

你可以試試這個:

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_longest0fillvalue - 這基本上填補缺失指數與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) 
+0

非常清晰的解釋和簡潔的代碼。謝謝!! – Albert

+0

@Albert沒有問題,一切都好運! – RocketDonkey

+2

或者'map(總和,zip(* l))'(這是我的最愛)。 – arshajii

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

對於任何矩陣(或其他雄心勃勃的數字)業務我會建議看看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

尤其是第二個參數是有趣的,因爲它允許輕鬆指定應該總結的內容:所有元素或僅潛在n維數組(如)的特定軸。

+0

感謝您的詢問。我添加了一個樣本。我認爲這比其他任何樣本的時間和空間效率要高。 – Theuni

+0

非常酷(和更簡單的語法來消化比我:))。 – RocketDonkey

+0

讚賞 - 尤其是考慮到我之前從未使用Numpy,但我知道一些做科學計算並廣泛使用它的人。我很驚訝自己這是多麼容易。 – Theuni

1
>>> 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 
6

這會給你的和每個子列表

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

如果你想總結了所有的元素和得到的只是一個總和然後用這個

data = [[3,7,2],[1,4],[9,8,7,10]] 
sum(sum(data, [])) 
51 
+0

你恰好在Coursera上做線性代數課程嗎?你能解釋爲什麼第二個工作嗎? – Parseltongue

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