我们需要将两个列表合并为一个列出单词出现在列表中的频率的人。
如果我们有:
`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,否则将两个列表的频率值写入新列表。
答案 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