列表清单的总和;返回总和列表

时间:2012-12-09 00:09:24

标签: python list matrix sum

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?谢谢!

10 个答案:

答案 0 :(得分:60)

你可以试试这个:

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使用fillvalue 0 - 这基本上用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)

答案 1 :(得分:10)

对于任何矩阵(或其他雄心勃勃的数字)操作,我建议您查看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的sum函数文档:http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum

特别是第二个参数很有意思,因为它允许轻松指定应该总结的内容:所有元素或只是潜在n维数组的特定轴(如)。

答案 2 :(得分:8)

这将为您提供每个子列表的总和

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

答案 3 :(得分:2)

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

答案 4 :(得分: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]

答案 5 :(得分: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

答案 6 :(得分:0)

numArr = [[12, 4], [1], [2, 3]]

sumArr = 0

sumArr = sum(sum(row) for row in numArr)

print(sumArr) 

the answere: 22

我做了什么: 例如,当您像这样“做”时: [numArr中的行的row.append(1)] 该列表将更改为: [[12,4,1],[1,1],[2,3,1]] 我使用了python中的函数sum(),该函数获取列表并对其进行迭代,并将列表中所有数字的总和。当我执行sum(sum())时,我得到了大列表中所有列表的总和。

答案 7 :(得分:0)

此解决方案假定一个正方形矩阵,并使用两个for循环在列和行上循环,从而在过程中逐列添加。结果以列表形式返回。

def foo(data):
    # initialise length of data(n) and sum_of_col variable 
    n = len(data)
    sum_of_col = []

    # iterate over column
    for col_i in range(n):
        # column sum
        col_count = 0;

        #iterate over row
        for row_i in range(n):
            col_count += data[row_i][col_i]

        # append sum of column to list    
        sum_of_col.append(col_count)

    return sum_of_col

答案 8 :(得分:0)

将不同长度或相同长度的列表汇总的最简单解决方案是:

total = 0
for d in data:
    total += sum(d)

了解列表理解后,您可以将其缩短:

sum([sum(d) for d in data])

答案 9 :(得分:0)

对于数据是字符串列表的列表的情况。将元素列表的列表求和或连接起来。

>>> a = [list('abc'),list('def'),list('tyu')]
>>> a
[['a', 'b', 'c'], ['d', 'e', 'f'], ['t', 'y', 'u']]
>>> [''.join(thing) for thing in zip(*a)]
['adt', 'bey', 'cfu']
>>>