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

时间:2015-11-28 08:46:49

标签: 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

隔离对

5 个答案:

答案 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来获取每对元素的差异是微不足道的。所以基本上我告诉你把问题分成两个更简单的子问题:

  1. 编写一个将列表分组成对的函数。
  2. 使用map计算每对的差异。
  3. 我将给出的提示是,mapreduce对步骤#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