【发布时间】:2017-12-13 02:39:58
【问题描述】:
我有一个数组,我想计算数组中每个项目的出现次数。
我已经设法使用 map 函数来生成元组列表。
def mapper(a):
return (a, 1)
r = list(map(lambda a: mapper(a), arr));
//output example:
//(11817685, 1), (2014036792, 1), (2014047115, 1), (11817685, 1)
我希望 reduce 函数可以帮助我按每个元组中的第一个数字 (id) 对计数进行分组。例如:
(11817685, 2), (2014036792, 1), (2014047115, 1)
我试过了
cnt = reduce(lambda a, b: a + b, r);
还有其他一些方法,但它们都不起作用。
注意 感谢所有关于解决问题的其他方法的建议,但我只是在学习 Python 以及如何在这里实现 map-reduce,并且我已经简化了我的实际业务问题以使其易于理解,所以请告诉我做map-reduce的正确方法。
【问题讨论】:
-
lambda a: mapper(a)?为什么不直接通过mapper?另外:您的预期输出是什么? -
感谢您的评论。是的,我可以直接传入映射器,正在试验其他东西。已添加我的预期输出。
-
你需要
r还是只是一个中介? -
只是中间人。
-
reduce和map都没有真正帮助你。这类任务是存在collections.Counter的原因(对于输入已经排序的更特殊情况,itertools.groupby)。 Map/Reduce 策略适用于您有许多 mapper 并行馈送许多 reducer 的情况;盲目地将相同的模式应用于纯单线程代码是一种浪费(在 Map/Reduce 情况下也是一种浪费,您只能依靠荒谬的并行度来弥补开销)。
标签: python python-2.7 mapreduce