将两个列表 ["String",Float] 合并到新列表 ["String",Float,Float]

Merge two List ["String",Float] into new list ["String",Float,Float]

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

如果我们有:

        `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 不包含元素写入 0,否则将两个列表的频率值写入新列表。

这在处理排序列表时很容易。在这种情况下,您需要扩充通常的 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 = ......
         ......

您必须在这里完成缺失的案例(对于空列表也是如此)。

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

保持列表的顺序重要吗?如果没有,您可以使用 Data.Map 来完成此操作。这为您提供了一个映射,其中键是每个单词,值是 [Float]。作为奖励,您可以根据需要以这种方式组合任意数量的列表。

import Control.Arrow (second)

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