【问题标题】:Group by first element of a list of tuple and apply function to all grouped second elements [duplicate]按元组列表的第一个元素分组并将函数应用于所有分组的第二个元素[重复]
【发布时间】:2023-03-03 18:09:01
【问题描述】:

我有一个清单

[(8,2),(3,2),(3,1),(10,2),(10,6)] :: [(Int,Int)]

我想得到一个元组列表,它按元组列表的第一个元素分组。我也想为所有分组元组应用一个函数,例如总和。

在应用 group by 和函数 (+) 之后,我期待结果:

[(8,2),(3,3),(10,8)] :: [(Int,Int)]

我怎样才能用 Haskell 做到这一点?


编辑

这不是与 How to group similar items in a list using Haskell? 因为我还想知道如何将函数应用于分组元组列表中的每个第二个元素。


我尝试了以下方法,我认为它现在可以工作了。

test :: Eq a => Tree a -> [(a,Int)]
test t = map (foldl1 sumZahlwerte) grouped
  where grouped = groupBy (\c d -> fst c == fst d) (getTuple t)

sumZahlwerte :: Eq a => (a,Int) -> (a,Int) ->  (a,Int)
sumZahlwerte (b,c) (_,e) = (b,c+e)

其中getTuple t 返回一个[(a,Int)] 列表。

非常感谢您的反馈。感谢您的帮助!

【问题讨论】:

  • 你尝试了什么?
  • 我认为我可以使用groupBy function。但我不知道怎么做。
  • 没错。现在你只需要一个函数,它接受两个元组,如果它们的第一个元素相等则返回 True。请注意,group 仅对连续元素进行分组。

标签: list haskell group-by tuples


【解决方案1】:

这似乎是一项家庭作业/学习作业,所以我只提供一些提示:

  • 你已经命名了你需要的最重要的函数groupBy(来自Data.List
  • 此外,你需要一些东西来分组——你可以使用 lambda 表达式,或者 Data.Function 模块提供的小函数 on - (==) `on` fst 将是在 haskell 中编写它的一种惯用方式,但对于该练习编写了一个 lambda 函数 - 进行“比较”
  • 在分组之后,你有 [[(Int,Int)]] 类型的东西,并且使用方便的函数 mapfoldr1,你可以添加这些对 - 前提是你有一个函数 add2 :: (Int,Int) -> (Int,Int) -> (Int,Int) 可以添加第二个组件

【讨论】:

  • 请注意,通常您希望使用foldr 而不是foldr1,因为foldr1[] 失败。然而,由于group 永远不会创建空的组列表(我的意思是[[]][]),这里foldr1 很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
相关资源
最近更新 更多