【问题标题】:Haskell: Combine integers in a list of tuples [duplicate]Haskell:在元组列表中组合整数[重复]
【发布时间】:2015-12-22 13:30:51
【问题描述】:

我需要从这里出发:

[(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]

到这里:

[([1, 2], "a"), ([1], "b"), ([1], "c"), ([2], "dd")]

到现在为止

combineInts listTuple = someFunc (map (\(num, str) -> ([num], str)) listTuple)

“someFunc”是我仍然需要弄清楚和实施的地方。我相信它应该利用 foldr、map 和/或 intercalate 来实现我的目标。有什么想法吗?

【问题讨论】:

  • 这看起来像你想用大写字母 M Map 进行某种分组。
  • 不,它是来自 Data.Map 的数据结构。
  • 我认为更好的副本是How to group similar items in a list?;当前副本的答案似乎主要是关于格式,而这个问题主要是关于分组部分。
  • @DanielWagner 这将是一个更好的链接回问题,我主要将其作为重复项关闭,因为 OP 两次询问了本质上相同的问题。我会看看是否可以重新打开,然后将其标记为您链接的问题的副本。编辑:我暂时无法投票关闭它,请随时投票。

标签: list function haskell tuples


【解决方案1】:

应该这样做:

import Data.Function (on)
import Data.List (groupBy, sort, sortBy)

out = map f . groupBy ((==) `on` snd) . sortBy (compare `on` snd) $ input
  where input = [(2,"a"),(1,"a"),(1,"b"),(1,"c"),(2,"dd")]
        f xs@(x:_) = (sort $ map fst xs, snd x)

main = print out

【讨论】:

    【解决方案2】:

    如果您先订购列表,则可以使用 groupBy 执行此操作:

    import Data.List (groupBy)
    import Data.Ord (comparing)
    import Data.Function (on)
    
    map (\l@((_,c):_) -> (map fst l, c))  $ groupBy (on (==) snd) $ sortBy (comparing snd) inputList
    

    【讨论】:

    • 这假设所有具有相同snd 的元素已经一起出现在输入中。如果您先排序,则确保这不是问题。
    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    相关资源
    最近更新 更多