给定一个列表(例如[1,2,2,3,3,4,5,6]
),如何根据箱/范围对它们进行分组和计数?我希望能够指定一个范围,以便:
假设range = 2,并使用前面的列表,将给出[1, 4, 2, 1]
1 0或1、4 2或3、2 4或5以及1 6或7。
假设range = 4,并使用前面的列表,将给我[5,3],假设有5个0或1或2或3,3个4或5或6或7个。
我已经调查group
和groupBy
,但没有找到合适的谓词,也直方图填充库。后者对于创建垃圾箱似乎非常好,但是我无法找到如何将数据加载到这些垃圾箱中。
我该如何实现?
我对以下建议之一的尝试:
import Data.List
import Data.Function
quantize range n = n `div` range
main = print (groupBy ((==) `on` quantize 4) [1,2,3,4,2])
当其应为[[1,2,2,3],[4]]时,输出为[[1,2,3],[4],[2]]。以下两个建议都适用于排序列表。
main = print (groupBy ((==) `on` quantize 4) (sort [1,2,3,4,2]))
您需要量化以获取垃圾箱的定义。
-- `quantize range n` rounds n down to the nearest multiple of range
quantize :: Int -> Int -> Int
groupBy
带有一个“谓词”参数*,它标识是否应将两个项目放在同一容器中。所以:
groupBy (\n m -> quantize range n == quantize range m) :: [Int] -> [[Int]]
会根据元素是否在同一个容器中对元素进行分组,而不更改元素。如果range
是2,那会给你类似的东西
[[1],[2,2,3,3],[4,5],[6]]
然后,您只需要获取length
每个子列表的即可。
*调用了一个整洁的函数on
,使您可以更简洁地编写谓词
groupBy ((==) `on` quantize range)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句