我想总结两个列表(按元素)。我有以下示例:
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,...等)。可以修改此代码以实现我想要的吗?
答案 0 :(得分:3)
将zip
和map
与list 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]