让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/) –