在python map函数中使用reduce

时间:2017-10-03 04:04:17

标签: python python-2.7 mapreduce python-multiprocessing

我有这种情况,我有一个列表列表列表,我需要在第一个列表的每个子列表上应用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操作。关于重构代码的任何输入都要考虑到这一点。非常感谢。

2 个答案:

答案 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)