0

並べ替えられていない単語のリストをタプルのリスト (単語、カウント) に変換するにはどうすればよいですか?

["AAA","America", "England", "Spain"," Ireland"," aeroplane",
 "aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER",
 "Zebra", "America", "Elephant", "abc", "A.B.C." , "haskell", "Haskell", "ZZZ", "zzz"]

期待される出力:

[("a.b.c.",1),("aaa",1),("abc",1),("aeroplane",4),("america",2),("elephant",1)
,("england",1),("haskell",2),("helicopter",2),("ireland",1),("spain",1),("zebra",1),("zzz",2)]

[("a.b.c",1), ("zzz", 2)]
4

3 に答える 3

2

これを理解しやすいようにステップに分けました。まず、リストを並べ替えてから、(Word, Count) タプルのリストに減らします。

import Data.Char (toLower)

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []  
quicksort (x:xs) =
  (quicksort [a|a<-xs, a<=x]) ++ [x] ++ (quicksort [a|a<-xs, a>x])

addCount :: String -> [(String, Int)] -> [(String, Int)]
addCount a [] = [(a, 1)]
addCount a (x:xs)
  | a == fst x = (fst x, (snd x) + 1) : xs
  | otherwise  = x : (addCount a xs)

occurrences :: [(String, Int)] -> [String] -> [(String, Int)]
occurrences counts [] = counts
occurrences counts (x:xs) =
  occurrences countL xs
  where countL = addCount x counts

myList = ["AAA","America", "England", "Spain","Ireland", "aeroplane",
          "aeroplane", "Aeroplane", "AeRoPlAne", "helicopter", "HELICOPTER",
          "Zebra", "America", "Elephant", "abc", "A.B.C." , "haskell", "Haskell",
          "ZZZ", "zzz"]

main = do
  let downcased = map (map toLower) myList
  let sorted = quicksort downcased
  let occurencesL = occurrences [] sorted
  putStrLn . show $ occurencesL
  putStrLn . show $ [head occurencesL, last occurencesL]

これは非常に冗長ですが、この方法で何が起こっているのかを簡単に理解できることを願っています。

より短い方法の例:

  import Data.Char (toLower)
  import Data.List

  main = do
    let l = map (\a -> (head a, length a)) $ groupBy (\x y -> (map toLower x) == (map toLower y)) myList
    putStrLn . show $ l
    putStrLn . show $ [head l, last l]
于 2012-06-29T17:02:11.337 に答える
1

ここにワンライナーがあります:

    Data.List.sort $ Data.Map.toList $ Data.Map.fromListWith (+) [(map Data.Char.toLower word, 1) | word <- lst]
于 2012-06-30T11:52:47.877 に答える
0

グループ化機能:

myGroup :: [[Char]] -> [([Char],Int)]
myGroup = fmap (\x -> (head x,length x)) . groupBy (==) . sort . fmap (fmap toLower . filter (not . isSpace))

String からスペースを削除したいと想定していることに注意してください。フィルターを変えることで、その部分を簡単に変えることができます。

次に、境界関数:

headLast :: [t] -> [t]
headLast xs = [head xs,last xs]
于 2012-07-01T22:19:47.947 に答える