我有一对配对列表,我想删除列表中的所有重复项。所以例如我有[(1,7),(7,1),(2,3),(3,4),(4,3)]并且在使用函数之后我会[(1,7) ,(2,3),(3,4)]。
是否已有一个功能可以执行此类操作或实现此功能的简单方法?
答案 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)