在Python的map函数中使用reduce

3

我有这样一个情况,我有一个列表的列表的列表,并且我需要在第一个列表的每个子列表上应用缩减。 缩减函数需要2个参数,但是第二个参数(我想要应用缩减的列表的列表)应该来自我传递给映射函数的主列表 请考虑下面的代码片段。

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]],它是传递给map函数的内部列表的成对求和。我无法想出如何建模map和reduce以将正确的参数传递给reduce函数。

我的最终目标是使用包中的Pool.map在多个核心上执行reduce操作。如果有关重构代码以实现此目的的任何输入都将不胜感激。


我明白你想使用 map,但你是否需要使用 reduce?我可以看到这可以使用 zip 来完成。 - Elliot Roberts
reduce 似乎可以接受多个列表并将其减少为一个值。我认为你不能用 reduce 实现你想要的功能。 - Moondra
2个回答

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)

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接