使用 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
计算每对元素的差值就很简单了。所以基本上我告诉你把问题分成两个更简单的子问题:
- 编写一个函数,将列表分组成对。
- 使用
map
计算每对的差异。
我要给出的提示是 map
和 reduce
对步骤 #1 都不是特别有用。
我正在使用 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
计算每对元素的差值就很简单了。所以基本上我告诉你把问题分成两个更简单的子问题:
- 编写一个函数,将列表分组成对。
- 使用
map
计算每对的差异。
我要给出的提示是 map
和 reduce
对步骤 #1 都不是特别有用。