将两个List [“String”,Float]合并到新列表中[“String”,Float,Float]

时间:2015-05-06 22:14:50

标签: list haskell merge haskell-platform

我们需要将两个列表合并为一个列出单词出现在列表中的频率的人。

如果我们有:

        `List 1 [("Hi", 0.45),("Steve", 0.0.5),("Bye",0.9)]...`

        `List 2 [("Hello", 0.56), ("Steve", 0.6), ("Bye", 0.6)]..`

我们希望得到:[("Hi",0.45,0), ("Steve", 0.0.5, 0.6)...

 mergeLists :: [(a,Float)] -> [(a,Float)] -> [(a,Float,Float)]
 mergeLists v y = map (\x -> ( fst x, if not (elem (fst x) v) then 0 
                                        else 5 ,
                                        if not (elem (fst x) v) then 5
                                        else 0))y

现在我们正在使用以下代码,但是我们还有很多问题需要继续。

我正在尝试前进第一个列表,如果list2不包含元素write 0,否则将两个列表的频率值写入新列表。

2 个答案:

答案 0 :(得分:2)

使用排序列表时这很容易。在这种情况下,您需要扩充通常的union函数定义,使其适应您的特定数据类型,例如

mergeOrderedLists a b = go a b 
   where go a@((x,n):t) b@((y,m): ..... ) = case compare x y of
                LT -> (x,n,0) : go t b
                EQ -> ....... : go t r 
                GT -> ....... : go a r
         go [] b = ......
         ......

你必须在这里完成遗漏的案件(以及空列表)。

您必须对每个参数列表进行排序才能使用此功能,以定义您描述的内容。

答案 1 :(得分:1)

保留列表的顺序是否重要?如果没有,您可以使用Data.Map执行此操作。这会为您提供一个映射,其中键是每个单词,值为[Float]。作为奖励,您可以根据需要以这种方式组合多个列表。

import Control.Arrow (second)

M.fromListWith (++) $ map (second (:[])) $ list1 ++ list2