Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用map/reduce添加列表中数字对的差异_Python_List_Functional Programming_Reduce - Fatal编程技术网

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

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隔离对您正在寻找的递归关系

我正在使用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隔离对

您正在寻找的递归关系是

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