修改代码以将两个列表相加(元素方式)

时间:2017-12-01 18:03:39

标签: python python-2.7

我想总结两个列表(按元素)。我有以下示例:

from operator import add

L1 = [[1,2,3], [4,5,6], [7,8,9]]
L2 = [[10,20,30], [40,50,60], [70,80,90]]
W = map(add, L1, L2)
print (W)

但结果是:

[[1, 2, 3, 10, 20, 30], [4, 5, 6, 40, 50, 60], [7, 8, 9, 70, 80, 90]]

我想要sum元素(例如1 + 10 = 20,2 + 20 = 20,...等)。可以修改此代码以实现我想要的吗?

4 个答案:

答案 0 :(得分:3)

zipmaplist comprehension一起使用:

>>> temp = zip(L1, L2)
# >>> list(temp)
# => [([1, 2, 3], [10, 20, 30]), ([4, 5, 6], [40, 50, 60]), ([7, 8, 9], [70, 80, 90])]

>>> [list(map(sum, zip(x,y))) for x,y in temp]
=> [[11, 22, 33], [44, 55, 66], [77, 88, 99]]

注意:仅使用zip(L1, L2) 比执行list(zip(L1, L2))更好,因为前者返回Generator更有效率比建立一个清单更快。

答案 1 :(得分:3)

你可以试试这个:

L1 = [[1,2,3], [4,5,6], [7,8,9]]
L2 = [[10,20,30], [40,50,60], [70,80,90]]
final_list = [[c+d for c, d in zip(a, b)] for a, b in zip(L1, L2)]

输出:

[[11, 22, 33], [44, 55, 66], [77, 88, 99]]

答案 2 :(得分:2)

这是因为当您add两个列表在一起时,您实际上正在使用串联...

除非你有充分的理由不使用numpy,否则这很容易做到:

import numpy as np

L1 = np.array([[1,2,3], [4,5,6], [7,8,9]])
L2 = np.array([[10,20,30], [40,50,60], [70,80,90]])
W = L1 + L2

或者,不使用numpy,在我看来比使用zip更清晰一点:

W = [list(map(add,L1[i],L2[i])) for i in range(len(L1))]

答案 3 :(得分:2)

这是一个非常整洁(即使我自己这么说)递归解决方案:

def add(l1, l2):
    return [add(l1[i], l2[i]) if type(l1[i]) == list else l1[i] + l2[i] for i in range(len(l1))]

,与add(L1, L2)一起运行时:

[[11, 22, 33], [44, 55, 66], [77, 88, 99]]

关于这个功能的一个很酷的事情是,无论lists是如何嵌入的,即使存在混合(即不是矩形),它也会起作用。

所以这是该功能的一个很好的例子:

>>> add([1, [2, 3, [4, 5]], 6], [7, [3, 4, [2, 4]], 1])
[8, [5, 7, [6, 9]], 7]