【问题标题】:Merge two List ["String",Float] into new list ["String",Float,Float]将两个列表 ["String",Float] 合并到新列表 ["String",Float,Float]
【发布时间】:2015-07-17 06:57:58
【问题描述】:

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

如果我们有:

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

【问题讨论】:

  • 您有什么具体的问题吗?
  • @neuronaut 我该怎么做?我正在尝试使用我附加的代码。但是还不行。

标签: list haskell merge haskell-platform


【解决方案1】:

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

您必须在此处填写缺失的案例(以及空列表)。

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

【讨论】:

  • 我们必须在第一点线定义什么? a@((x,n):t) b@((y,m): ..... )
【解决方案2】:

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

import Control.Arrow (second)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多