Python 用Counter做映射,当需要对集合按照某些值进行分组并计算频次时,可以使用collections.Counter
等优化工具。对于函数式编程,分组数据的典型处理方式分为两步,首先对原始集合排序,然后用一个递归循环识别出每一组的开始位置。这当中涉及实例化原始数据,执行一个复杂度为O(n log n)的排序,最后对每个键值进行归约,得到累积值或者频次。
下面的生成器创建了分箱后的一组路径值:
quantized = (5 * (dist // 5) for start, stop, dist in trip)
每个距离值除以5取整再乘以5,就得到了5海里的倍数。
下面的表达式创建了从距离到频次的映射:
from collections import Counter
Counter(quantized)
这是一个有状态的对象,从技术上看,它是通过命令式的面向对象编程创建出来的,但它看上去像函数,也符合函数式编程的设计理念。
打印Counter(quantized).most_common()
函数的返回值,结果如下:
[(30.0, 15), (15.0, 9), (35.0, 5), (5.0, 5), (10.0, 5), (20.0, 5),
(25.0, 5), (0.0, 4), (40.0, 3), (45.0, 3), (50.0, 3), (60.0, 3),
(70.0, 2), (65.0, 1), (80.0, 1), (115.0, 1), (85.0, 1), (55.0, 1),
(125.0, 1)]
出现频次最高的距离值是30海里,最短的路径段为4个0海里,最长的是125海里。
你的运行结果可能与上面的略有不同,因为most_common()
函数是按频次排序的,相同的频次可能以任意顺序输出,所以下面5个长度的出现顺序可能会不同。
(35.0, 5), (5.0, 5), (10.0, 5), (20.0, 5), (25.0, 5)