使用lisp中的嵌套列表删除列表的重复元素

时间:2013-01-23 08:39:34

标签: list lisp common-lisp duplicate-removal nested-lists

lisp中的函数remove-duplicates仅适用于像(a b c d)这样的简单列表。 我的问题是我如何从列表中删除重复元素,其中包含嵌套列表。例如,

我有一个嵌套列表的列表如下:((0 1)(0 2)(0 1)(0 3))

我想删除其中一个(0 1)列表,它在上面的列表中重复两次以获得:

((0 1)(0 2)(0 3))

1 个答案:

答案 0 :(得分:6)

:test #'equal提供给remove-duplicates,它会做你想要的。

正如我们在CLHS: Satisfying a Two-Argument Test中看到的那样,:test默认为#'eql未给出,(0 1)等两个列表不是eql,除非它们是相同的列表eq)。

CL-USER> (remove-duplicates '((0 1) (0 2) (0 1) (0 3)) :test #'equal)
((0 2) (0 1) (0 3))