gpt4 book ai didi

haskell - 如何在haskell中进行分组和计数?

转载 作者:行者123 更新时间:2023-12-02 15:33:02 25 4
gpt4 key购买 nike

给定一个列表(例如[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。

我已经研究了groupgroupBy,但没有找到合适的谓词,也没有找到直方图填充库。后者似乎非常适合创建垃圾箱,但我不知道如何将数据加载到这些垃圾箱中。

我怎样才能实现这个目标?

我对以下建议之一的尝试:

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]))   

最佳答案

您可以使用groupBydiv 函数来实现此目的。假设我们有一个范围 N。如果我们得到 N 个连续数字的整除 (div),所有这些都应该相等。例如,N=30 div 3 = 0、1 div 3 = 0、2 div 3 = 0、3 div 3 = 1、4 div 3 = 1、5 div 3 = 1, 6 div 3 = 2

知道了这一点,我们可以查看 groupBy::(a -> a -> Bool) -> [a] -> [[a]] 并使用该函数:

sameGroup :: Integral a => a -> a -> a -> Bool
sameGroup range a b = a `div` range == b `div` range

编写我们自己的分组函数

groupings :: Integral a => a -> [a] -> [[a]]
groupings range = groupBy (sameGroup range)

应该类似于groupings 2 [1, 2, 2, 3, 3, 4, 5, 6] == [[1], [2, 2, 3, 3], [4, 5]、[6]]。现在我们只需要计算它就可以得到最终的函数

groupAndCount :: Integral a => a -> [a] -> [Int]
groupAndCount range list = map length $ groupings range list

这应该反射(reflect)想要的行为。

关于haskell - 如何在haskell中进行分组和计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32300651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com