在 python 映射函数中使用 reduce

using reduce inside a python map function

在这种情况下,我有一个列表的列表列表,我需要对第一个列表的每个子列表应用 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]]].

我希望上面的 map 和 reduce 的最终输出是 2 个列表 [[4,4,4],[6,6,6]] 这是传递给地图的列表内部列表的成对总和。 我不知道如何对地图建模并减少以将适当的参数传递给减少函数。

我的最终objective是使用multiprocessing包中的Pool.map在多核上执行reduce操作。非常感谢任何有关重构代码的意见。

我会这样执行成对求和运算:

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]]

在Python2中,mapreturns一个列表,所以你可以做

[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)

使用所需方法回答问题:

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)