gpt4 book ai didi

haskell - 在haskell中为元组列表分配等级

转载 作者:行者123 更新时间:2023-12-04 17:35:31 25 4
gpt4 key购买 nike

如何为 Haskell 中的元组列表分配排名(考虑到关系)?理想情况下,想要一个给出元组列表的函数,将返回一个带有等级的元组列表。

样本输入(假设根据每个元组的 snd 按升序排序):

results1 = [("a",12),("b",56),("c",61),("d",73),("e",75),("f",75),("g",81),("h",82),("i",91),("j",97)]

示例输出:
[("a",1),("b",2),("c",3),("d",4),("e",5.5),("f",5.5),("g",7),("h",8),("i",9),("j",10)]

请注意“e”和“f”并列,因此它们的等级(5 和 6)相加并除以 2。更一般地说,特定等级范围 [i..j] 的任何 n 个等级都将获得和 [i..j]/n 的相同等级。

注意:我今天刚刚开始学习 Haskell(来自 Python 和 Java),所以我更愿意提供有用的提示而不是透露答案。足以让我找到正确的解决方案。谢谢!

编辑/第 2 部分问题:好的,感谢 jamshidh、chunksof50 和 leftaroundabout 我想出了
sortStudents xs = sortBy (compare `on` snd) xs

prerankStudents xs = groupBy ((==) `on` (snd.fst)) (zip (sortStudents xs) [1..])

rankStudents xs = concat [ [if length ys > 1 then (a, fromIntegral (sum (map snd ys)) / fromIntegral (length ys)) else (a,fromIntegral c) | ((a,b),c) <- ys] | ys <- (prerankStudents . sortStudents) xs ]

我对 sortStudents 和 prerankStudents 比较满意,但是 rankStudents 感觉有点像我又在写 python(列表理解),尽管我不确定在这种情况下它是好是坏。我尝试使用 case..of 递归地实现 rankStudents ,但消除错误似乎在我的脑海中。如果有人愿意向我详细解释为什么它不起作用,这里是代码。
rankStudents xs = let ss = prerankStudents xs
rankStudents' ys = case ys of [] -> []
[((a,b),c)] -> [(a,c)]
(((a1,b1),c1):zs) -> [((fst.fst) tup, fromIntegral (sum (map snd ys)) / fromIntegral (length ys)) | tup <- ys]
y:ys -> rankStudents' y ++ rankStudents' ys
in rankStudents' ss

最佳答案

这里有一些你会发现有用的功能......

Data.List.groupBy
Data.List.sortBy --you won't actually need this if you assume the input is ordered, but I threw it in anyway
Data.Function.on
(==)

您可以按第二项对数据进行分组,然后使用递归输出值,增加每个项目的排名......如果一组中的项目数大于一,只需增加此值,并输出值根据组中排名的值的平均值。

这足以让您在不提供完整答案的情况下继续前进。

关于haskell - 在haskell中为元组列表分配等级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915168/

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