我正在使用python练习函数式编程概念。我遇到了这个问题。我已经尝试了很多,并且无法使用map / reduce,closures等函数式编程结构找到解决方案。
问题:给出一个数字列表
list = [10, 9, 8, 7, 6, 5, 4, 3]
使用Map / Reduce或任何函数式编程概念(例如
)找出每对中的差异总和[[10 -9] + [8 - 7] + [6 -5] + [4 - 3]] = 4
对我来说,棘手的部分是使用map / reduce / recursion / closure
隔离对答案 0 :(得分:2)
您正在寻找的递归关系是
f([4, 3, 2, 1]) = 4 - 3 + 2 - 1 = 4 - (3 - 2 + 1) = 4 - f([3, 2, 1])
答案 1 :(得分:2)
许多功能程序员遵循的其中一个咒语如下:
将此问题应用于您的问题,您遇到了一个简单的问题:列表数据结构不会以任何方式编码您要操作的对之间的关系。所以map
/ reduce
操作,因为它们在列表结构上工作,所以对这些对没有任何自然的可见性!这意味着你可以“游说当前”这些行动,可以这么说。
因此,第一步应该是将数据组织为对的列表或流:
pairs = [(10, 9), (8, 7), (6, 5), (4, 3)]
现在在完成之后,使用map
来获取每对元素的差异是微不足道的。所以基本上我告诉你把问题分成两个更简单的子问题:
map
计算每对的差异。我将给出的提示是,map
和reduce
对步骤#1都不是特别有用。
答案 2 :(得分: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))))
或范围和项目:
from operator import itemgetter as itgt
print(sum(itgt(*range(0, len(l), 2))(l)) - sum(itgt(*range(1, len(l), 2))(l)))
答案 3 :(得分:0)
另一种尝试可能是隔离对 - 您可能需要事先对列表进行排序
>>>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
答案 4 :(得分:0)
你可以用简单的方式做到。
l = [10, 9, 8, 7, 6, 5, 4, 3]
reduce(lambda x, y : y - x, l) * -1