讓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?謝謝!
讓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?謝謝!
你可以試試這個:
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
與0
的fillvalue
- 這基本上填補缺失指數與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)
非常清晰的解釋和簡潔的代碼。謝謝!! – Albert
@Albert沒有問題,一切都好運! – RocketDonkey
或者'map(總和,zip(* l))'(這是我的最愛)。 – arshajii
這不取決於你的假設,即所有的內部列表(或行)的長度是相同的,但它應該做你想要什麼:
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]
對於任何矩陣(或其他雄心勃勃的數字)業務我會建議看看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維數組(如)的特定軸。
感謝您的詢問。我添加了一個樣本。我認爲這比其他任何樣本的時間和空間效率要高。 – Theuni
非常酷(和更簡單的語法來消化比我:))。 – RocketDonkey
讚賞 - 尤其是考慮到我之前從未使用Numpy,但我知道一些做科學計算並廣泛使用它的人。我很驚訝自己這是多麼容易。 – Theuni
>>> 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
這會給你的和每個子列表
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
你恰好在Coursera上做線性代數課程嗎?你能解釋爲什麼第二個工作嗎? – Parseltongue
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
[你有什麼嘗試?](http://whathaveyoutried.com/) –