2012-12-09 82 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