Python 使用map/reduce添加列表中数字对的差异
我正在使用python练习函数式编程概念。我遇到了这个问题。我已经尝试了很多,但找不到使用函数式编程结构(如map/reduce、closures)的解决方案 问题:给出一个数字列表Python 使用map/reduce添加列表中数字对的差异,python,list,functional-programming,reduce,Python,List,Functional Programming,Reduce,我正在使用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隔离对您正在寻找的递归关系
list = [10, 9, 8, 7, 6, 5, 4, 3]
使用Map/Reduce或任何函数式编程概念,例如
[[10 -9] + [8 - 7] + [6 -5] + [4 - 3]] = 4
对我来说,棘手的部分是使用map/reduce/recursion/closure隔离对您正在寻找的递归关系是
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
操作,因为它们在列表的结构上工作,所以对这些对没有任何自然的可见性!可以说,这意味着你在“逆流而上”
因此,第一步应该是将数据组织为一个列表或成对流:
现在,在完成这项工作之后,使用map
获取每对元素的差异是很简单的。所以基本上我告诉你把问题分成两个更简单的子问题:
map
计算每对的差异我要给出的提示是,无论是
map
还是reduce
对于第1步都不是特别有用。你能帮我回答这个问题吗?求求你了,我不是落选者@Sislam是函数编程中的一个漂亮函数。可以用任何语言实现。
pairs = [(10, 9), (8, 7), (6, 5), (4, 3)]