【发布时间】:2015-09-21 01:20:19
【问题描述】:
我正在尝试从之前状态到之后状态。有没有方便的 Haskell 函数从列表中删除重复的元组?或者它可能更复杂一些,比如遍历整个列表?
Before: the list of tuples, sorted by word, as in
[(2,"a"), (1,"a"), (1,"b"), (1,"b"), (1,"c"), (2,"dd")]
After: the list of sorted tuples with exact duplicates removed, as in
[(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
【问题讨论】:
-
用
map head . group在 O(n) 时间内从 排序 列表中删除重复项。 -
如果你允许
...(1,"b"),(2,"b"),(1,"b"),...,那么我们就必须使用map (head . nub) . groupBy ((==) `on` snd)。大概最长的组仍然很短,所以nub不会是这样的问题。如果没有,总是有Set或HashMap。不过,首先在 O(n) 中将其分成几组,不会有什么坏处。 -- 另一种可能性是通过sndmajor 和fstminor 按字典顺序(使用stable sort)重新排序,这应该是接近线性的;然后通过map head . group.