我有这种情况,我有一个列表列表列表,我需要在第一个列表的每个子列表上应用reduce。 reduce函数需要2个参数,但是第二个参数(我要应用reduce的列表列表)应该来自我传递给map函数的主列表 请考虑下面的代码段。
reducedLists = map(reduce(lambda first, second : map(operator.add, first,second), XXX), listsToReduce)
我需要知道应该通过什么代替上面的XXX
。
此处listsToReduce
是[[[1,2,3], [3,2,1]],[[1,3,5],[5,3,1]]]
等列表的列表。
我想要上面地图的最终输出并减少为2个列表
[[4,4,4],[6,6,6]]
,它是传递给地图的列表内部列表的成对总和。
我无法想象我如何为地图建模并减少将适当的参数传递给reduce函数。
我的最终目标是使用Pool.map
包中的multiprocessing
来执行多核上的reduce操作。关于重构代码的任何输入都要考虑到这一点。非常感谢。
答案 0 :(得分:2)
我以这种方式执行成对求和操作:
listsToReduce = [[[1,2,3], [3,2,1]], [[1,3,5], [5,3,1]]]
reducedLists = [list(map(sum, zip(*lst))) for lst in listsToReduce]
print(reducedLists)
<强>输出强>
[[4, 4, 4], [6, 6, 6]]
在Python 2中,map
返回一个列表,所以你可以做
[map(sum, zip(*lst)) for lst in listsToReduce]
但我强烈建议在所有新代码中使用Python 3,因为Python 2将在2020年达到其正式的生命终结。
这是在Python 2中执行此操作的另一种方法,但由于使用lambda
函数而不是sum
,效率较低。
from operator import add
reducedLists = map(lambda t: map(add, *t), listsToReduce)
答案 1 :(得分:0)
使用所需方法回答问题:
from functools import partial, reduce
import operator
listsToReduce = [[[1,2,3], [3,2,1]],[[1,3,5],[5,3,1]]]
f = partial(reduce, lambda first, second : list(map(operator.add, first,second)))
map(f, listsToReduce)