我有一个数组,我想计算每个项在数组中出现的次数。
我已经使用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
呢?另外,你期望的输出是什么? - internet_userr
吗?还是它只是一个中介? - internet_userreduce
也不是map
真正能帮助你处理这里的任务。这种类型的任务就是为什么有collections.Counter
存在(以及对于特殊情况,其中输入已经排序,还有itertools.groupby
)。Map/Reduce策略是用于并行运行许多mappers并馈送到并行的许多reducers的情况;将相同模式盲目应用于纯单线程代码是浪费的(在Map/Reduce情况下也是如此,你只是依靠荒谬的并行级别来弥补开销)。 - ShadowRanger