清除列表中的重复对

时间:2015-12-08 01:10:29

标签: haskell

我有一对配对列表,我想删除列表中的所有重复项。所以例如我有[(1,7),(7,1),(2,3),(3,4),(4,3)]并且在使用函数之后我会[(1,7) ,(2,3),(3,4)]。

是否已有一个功能可以执行此类操作或实现此功能的简单方法?

3 个答案:

答案 0 :(得分:4)

nubBy函数使用您为元素比较提供的函数从列表中消除重复元素。

nubBy (\x y -> (fst x == snd y && snd x == fst y) || (x == y)) [(1,7),(7,1),(2,3),(3,4),(4,3)]
[(1,7),(2,3),(3,4)]

答案 1 :(得分:2)

您可以对每个元组重新排序,以便您始终在左侧使用较小的元素,在右侧使用较大的元素。然后,您可以对列表进行排序,并从每个相同元素的运行中获取一个元素。我就是这样做的

import Control.Arrow ((&&&))
import Data.List (sort, group)

dedup = map head . group . sort . map (uncurry min &&& uncurry max)

答案 2 :(得分:2)

如果顺序不重要,您可以选择元组的版本,其中较小的元素后跟较大的元素作为每个元素的“规范”表示,然后对列表进行排序并删除相邻的重复项,或运行它们通过一组(都采取O(nlogn)时间)。

以下是后一种解决方案:

import Data.Set
removeDuplicates xs = toList (fromList (canonical xs))
    where canonical [] = []
          canonical ((a,b):t) = (if a < b then (a, b) else (b, a)) : (canonical t)