2015-09-28 29 views
4

说我有一个包含的[("ab", 1), ("ab", 2), ("ac", 3)]集团通过他们的第一个元素的元组的列表

使用group函数将这个列表分成像这样的元组的名单列表的元组列表:

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

你将如何组的元组无视这样,他们会基于元素的一个分组中的一个索引:

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

将在在这种情况下需要功能?

+3

您是否尝试过使用'groupBy'? – duplode

回答

7

使用Data.ListgroupBy功能(docs):

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

''groupBy((==)''fst)'' – dfeuer

+1

很好的简化@dfeuer。更新了我的答案 –

相关问题