2

本质上,我想对并行列表中的项目求和,如下所示:

[[1, 2, 3, 4],
 [4, 3, 2, 1]] # list of lists (can be more than two)

 [5, 5, 5, 5]  # result

但是,问题是列表多了一个维度,本质上是“3D”。但我只想总结最里面的对中的第二项:

[[[0, 1], [0, 2], [0, 3], [0, 4]],
 [[1, 4], [1, 3], [1, 2], [1, 1]]]  # add the numbers downward

 [[0, 5], [0, 5], [0, 5], [0, 5]]   # result

每对中的第一个项目可以单独放置。对他们来说,只复制第一行就可以了。


无论如何,我想不出这样做的好方法。我找到了这种方式:

l = [[[0, 1], [0, 2], [0, 3], [0, 4]],
     [[1, 4], [1, 3], [1, 2], [1, 1]]] 

s = map(sum, zip(*[[j[1] for j in i] for i in l])) # to be summed
o = [i[0] for i in l[0]] # others

result = [[j for j in i] for i in zip(o, s)]

...但我不能忍受它。如果有更好的方法,我将不胜感激。

感谢您的所有脑力劳动!

PS 请记住,列表中可以有任意数量的列表,而不仅仅是 2 个!

4

2 回答 2

3

迭代变量可以解包如下:

>>> for x in [[1,2], [3,4]]: print(x)
... 
[1, 2]
[3, 4]
>>> for a,b in [[1,2], [3,4]]: print(a+b)
... 
3
7
>>> for [a,b] in [[1,2], [3,4]]: print(a+b)
... 
3
7

更新

>>> xs = [[[0, 1], [0, 2], [0, 3], [0, 4]],
...       [[1, 4], [1, 3], [1, 2], [1, 1]],
...       [[1, 1], [1, 2], [1, 3], [1, 4]]]
>>> 
>>> [[x[0][0],sum(b for a,b in x)] for x in zip(*xs)]
[[0, 6], [0, 7], [0, 8], [0, 9]]
于 2013-09-30T05:20:40.480 回答
2

怎么用numpy?它还可以处理 3 维数组,并通过给定的轴( )简单地np.sum对所需的切片求和,并为了保留第一行中的列,将它们压缩在一起()x[:,:,1]0x[0,:,0]

import numpy as np
x = np.array( [[[0, 1], [0, 2], [0, 3], [0, 4]],
               [[1, 4], [1, 3], [1, 2], [1, 1]]] )
zip( x[0,:,0], np.sum( x[:,:,1], axis=0 ) )
于 2013-09-30T05:23:50.727 回答