我有一个这样的二维列表:
list1 = [[2,4,6,8,9],[8,9,10,12,15],[8,9,4,20,25]]
我想用另一行将每一行的每个元素相加,结果是这样的:
outcome_list = [[10,13,16,20,24],[16,18,14,32,40],[10,13,20,28,34]]
我的代码是这样的:
d = len(list1)
for i in range(0, d-1):
list2 = list[i][:] + list[i+1][:]
但它不起作用。
这可以像这样完成:
法典:
list1 = [[2, 4, 6, 8, 9], [8, 9, 10, 12, 15], [8, 9, 4, 20, 25]]
print([[sum(l) for l in zip(list1[i], list1[(i+1) % len(list1)])]
for i in range(len(list1))])
结果:
[[10, 13, 16, 20, 24], [16, 18, 14, 32, 40], [10, 13, 10, 28, 34]]
您可以通过将列表与自身压缩但项目向右旋转来配对子列表,并将对map
到列表推导式中的operator.add
方法:
from operator import add
[list(map(add, *p)) for p in zip(list1, list1[1:] + list1[:1])]
这将返回:
[[10, 13, 16, 20, 24], [16, 18, 14, 32, 40], [10, 13, 10, 28, 34]]
将zip()
与列表理解一起使用:
list1 = [[2,4,6,8,9],[8,9,10,12,15],[8,9,4,20,25]]
list1 = list1 + [list1[0]]
print([list(map(lambda x: sum(x), zip(x, y))) for x, y in zip(list1, list1[1:])])
# [[10, 13, 16, 20, 24], [16, 18, 14, 32, 40], [10, 13, 10, 28, 34]]
试试这个
d = len(list1)
for i in range(0, d-1):
list2 = [a + b for a,b in zip(list[i],list[i+1])]
使用numpy.roll
:
In [1]: import numpy as np
In [2]: a = np.array([[2,4,6,8,9],[8,9,10,12,15],[8,9,4,20,25]])
In [3]: a + np.roll(a, -1, axis=0)
Out[3]:
array([[10, 13, 16, 20, 24],
[16, 18, 14, 32, 40],
[10, 13, 10, 28, 34]])
这是使用迭代工具的另一种方法,它应该适用于 list1 中任意数量的列表:
from itertools import combinations
list1 = [[2,4,6,8,9],[8,9,10,12,15],[8,9,4,20,25]]
outcome = [ list(map(sum,zip(*rows))) for rows in combinations(list1,2) ]