【问题标题】:Merge list of tuples and list of integers合并元组列表和整数列表
【发布时间】:2021-10-21 18:33:43
【问题描述】:

我是 Haskell 的新手,目前正在学习列表。

我有一个标记列表

[("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]

我需要得到分数的总和和它的平均值。这是我的方法。

创建一个函数来计算每个候选人的分数总和列表

sumOfMarks = (\(a, b, c, d) -> b + c + d)

并将该函数映射到原始列表

newList = map sumOfMarks [("Tom", 87, 78, 67), ("Dick",  56, 45, 72)]

创建一个函数来计算每个候选人的平均分数列表

avgList = map (`div`3) newList

合并所有原始列表,newListavgList

想要的输出是

finalList = [("Tom", 87, 78, 67, 232, 77.34), ("Dick", 56, 45, 72, 173, 57.67)]

另一个问题是 - 这是否是解决问题的最佳方法,是否有更好的方法?

【问题讨论】:

  • 您可以使用将每个 4 元组映射到 5 元组的映射。

标签: list haskell merge tuples zip


【解决方案1】:

您可以创建一个将 4 元组映射到 5 元组的函数,因此该函数如下所示:

map (\(n, a, b, c) -> (n, a, b, c, …)) oldList

我把留在那里作为练习。

注意div :: Integral a => a -> a -> a 是整数除法。如果您需要使用浮点数,可以使用(/) :: Fractional a => a -> a -> a。要将Integral 数字转换为Fractional 数字,您可以使用fromIntegral :: (Integral a, Num b) => a -> b 函数。

【讨论】:

  • 嗨.. 感谢您的快速回复.. 一个问题.. 函数看起来像 map (\(n, a, b, c) -> (n, a, b, c, …)) oldList 还是您说必须创建一个自定义函数,然后将其映射到原始列表?
  • @radhikaiyer:需要填写,所以表达式为5元组的第五个元素。
  • 嗨..我很抱歉威廉..我仍然无法得到它..刚开始 LYAH 作为我的向导..它只讨论为超过 2 个元素元组创建自定义函数..有什么材料可以参考我可以查看将元素附加到元组的地方吗?
  • @radhikaiyer:Haskell 的基本概念之一是所有数据都是不可变的,所以你不附加项,你构造一个 new 元组,可以看作是修改后的副本。
  • 嗨..明白..所以我一直在尝试的是alist = [("a",1,2), ("b",5,6)] blist = [4,8] newList = zip alist blist.. which gives [(("a",1,2),4),(("b",5,6),8)],它没有得到元组内的元素..
【解决方案2】:

(省略了使用/ 而不是div 所必需的转换)

我们可以使用zipWith3 组合这三个列表,或者使用zip3 的列表推导式,

finalList =
 = zipWith3 (\ (n,a,b,c)  s  avg  ->  (n,a,b,c,s,avg)) 
               list  newList  avgList 
 = [ (n,a,b,c,s,avg) | ((n,a,b,c), (s, avg)) <- 
                          zip list 
                              (zip newList 
                                   avgList) ]
 = [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <- 
                          zip3 list 
                               (map sumOfMarks list)
                               (map (`div` 3) (map sumOfMarks list)) ]
 = [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <- 
                          zip3 list 
                               (map sumOfMarks list)
                               (map ((`div` 3) . sumOfMarks) list) ]
 = [ (n,a,b,c,a+b+c,(a+b+c)/3) 
                     | (n,a,b,c) <- list ]
 = [ (n,a,b,c,s,avg) 
                     | (n,a,b,c) <- list
                     , let s = a+b+c
                     , let avg = s/3 ]

列表推导通常比maps、zips、zipWiths 等的各种组合更直观(即更易于使用)。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2014-06-23
    • 2022-01-08
    相关资源
    最近更新 更多