按照第一个元素对一组元组进行分组

8

假设有一个元组列表,包含如下内容:[("ab", 1), ("ab", 2), ("ac", 3)]

使用group函数可以将该列表拆分为一个由元组列表组成的列表,如下所示:

[
  [("ab", 1)],
  [("ab", 2)],
  [("ac", 3)]
]

如果要按其中一个元素对元组进行分组,忽略其中一个索引,您会如何进行分组:

[
  [("ab", 1), ("ab", 2)],
  [("ac", 3]
]

在这种情况下,是否需要使用groupBy函数?

3
你尝试过使用groupBy吗? - duplode
1个回答

9

使用 Data.ListgroupBy 函数(文档):

Prelude> import Data.List
Prelude Data.List> let xs = [("ab", 1), ("ab", 2), ("ac", 3)]
Prelude Data.List> groupBy (\a b -> fst a == fst b) xs
[[("ab",1),("ab",2)],[("ac",3)]]

或者根据@dfeuer的建议:

...
import Data.Function
groupBy ((==) `on` fst) xs

4
按照键值对中的键进行分组,相同键的放在一起。(使用 on 函数指定比较的元素为键) - dfeuer
1
不错的简化 @dfeuer。我更新了我的答案。 - yǝsʞǝla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接