list - haskell 列出字符频率

标签 list haskell

我在做作业时遇到问题!

编写函数

freq2 :: String -> -> [(Int,[Char])]

freq一样,函数freq2计算字母字符出现的频率。

给定字符串:

我们认为这些真理是不言而喻的,即人人生而平等,造物主赋予他们某些不可剥夺的权利,其中包括生命权、自由权和追求幸福的权利

我需要结束:

[(1,"qv"), (2,"gm"), (3,"cfpwy"), (4,"b"), (5,"u"), (6,"do"),(8,"s"), (9,"ln"), (10,"i"), (12,"r"), (13,"h"), (16,"a"),(22,"t"), (28,"e")]

到目前为止我可以到达:

[('q',1),('v',1),('g',2),('m',2),('c',3),('f',3),('p',3),('w',3),('y',3),('b',4),('u',5),('d',6),('o',6),('s',8),('l',9),('n',9),('i',10),('r',12),('h',13),('a',16),('t',22),('e',28)]

使用:

 freq2 :: String -> [(Char,Int)]
 freq2 input = result2
    where
    lower_case_list = L.map C.toLower input
    filtered_list = L.filter C.isAlpha lower_case_list
    result = L.map (\a -> (L.head a, L.length a)) $ L.group $ sort filtered_list
    result2 = sortBy (compare `on` snd) result

是否有一种简单的方法可以使用库函数进入最后阶段或完成整个过程?或者您能否提供一些关于如何完成这个问题的指导?

谢谢

最佳答案

附加到您的解决方案中的类似内容应该有效:

result3 = map (\xs@((_,x):_) -> (x,  map fst xs)) $ L.groupBy ((==) `on` snd) result2

不过,我更喜欢使用 map 来解决这些类型的问题:

import qualified Data.Map as Map
import qualified Data.Char as C
import qualified Data.Tuple as T

string = filter C.isAlpha $ map C.toLower "We hold these truths to be self-evident, that all men are created equal, that they are endowed by their Creator with certain unalienable Rights, that among these are Life, Liberty and the pursuit of Happiness"

swapMapWith f = Map.fromListWith f . map T.swap . Map.toList

freq2 :: String -> [(Int, String)]
freq2 = Map.toList . swapMapWith (++) . foldl (\agg c -> Map.insertWith (+) [c] 1 agg) Map.empty

关于list - haskell 列出字符频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23636770/

相关文章:

list - 使用 `take` 实现 Haskell 的 `foldl` 函数

python - 如何浏览文件列表

如果所有元素都为零,则 Java 清除列表

java - 将列表分成更小的部分(可能使用 Wicket 口)

r - 在R中的for循环中向列表中添加元素

haskell - 结合 `SomeNat` 和 `Nat`

list - Haskell:在抽象数据类型上使用映射的问题

javascript - 拥有 N(数组中出现的次数)和一个数组,如何获取数组中出现 N 次的元素?

haskell - 单子(monad)定律的解释

haskell - 理解涉及 Left、Right 和 case 语句的示例