使用 map/reduce 添加列表中一对数字的差异

Adding difference of pair of numbers in list using map/reduce

我正在使用 python 练习函数式编程概念。我遇到了这个问题。我已经尝试了很多,但找不到使用 map/reduce、闭包等函数式编程结构的解决方案。

问题:给定一个数字列表

list = [10, 9, 8, 7, 6, 5, 4, 3]

使用 Map/Reduce 或任何函数式编程概念,例如

,找出每对中的差值之和
[[10 -9] + [8 - 7] + [6 -5] + [4 - 3]] = 4

对我来说棘手的部分是使用map/reduce/递归/闭包

隔离对

你要找的递归关系是

f([4, 3, 2, 1]) = 4 - 3 + 2 - 1 = 4 - (3 - 2 + 1) = 4 - f([3, 2, 1])

另一种尝试可能是分离对 - 您可能需要事先对列表进行排序

>>>import operator
>>>l=[10, 9, 8, 7, 6, 5, 4, 3]
>>>d= zip(l,l[1:])
>>>w=[d[i] for i in range(0,len(d),2)]#isolate pairs i.e. [(10, 9), (8, 7), (6, 5), (4, 3)]
>>>reduce(operator.add,[reduce(operator.sub,i) for i in w])
>>>4

你可以用简单的方法做到。

l = [10, 9, 8, 7, 6, 5, 4, 3]
reduce(lambda x, y : y - x, l) * -1

使用 itertools.starmap:

l = [10, 9, 8, 7, 6, 5, 4, 3]

from operator import  sub
from itertools import starmap

print(sum(starmap(sub, zip(*[iter(l)] * 2))))
4

或者只是一个 lambda:

print(sum(map(lambda x: sub(*x), zip(*[iter(l)] * 2))))

或者范围和itemgetter:

from operator import itemgetter as itgt

print(sum(itgt(*range(0, len(l), 2))(l)) - sum(itgt(*range(1, len(l), 2))(l)))

许多函数式程序员遵循的口头禅之一如下:

  • 数据应组织成数据结构,以反映您要对其执行的处理

将此应用于您的问题,您 运行 遇到了一个简单的问题:列表数据结构不会以任何方式编码您要操作的对之间的关​​系。所以 map/reduce 操作,因为它们在列表的结构上工作,所以对对没有任何自然可见性!这意味着您是这些操作的 "swimming against the current",可以这么说。

所以第一步应该是将数据组织为 的列表或流:

pairs = [(10, 9), (8, 7), (6, 5), (4, 3)]

现在 完成此操作后,使用 map 计算每对元素的差值就很简单了。所以基本上我告诉你把问题分成两个更简单的子问题:

  1. 编写一个函数,将列表分组成对。
  2. 使用map计算每对的差异。

我要给出的提示是 mapreduce 对步骤 #1 都不是特别有用。