如何从列表中删除子列表?

克里斯蒂安·迈斯纳(Christian Meissner)

我想从列表中删除特殊列表。但是功能删除对这个问题没有帮助。

它用于在列表中进行深度搜索,我想将其丢弃。我尝试了功能删除,但它不起作用。

(DEFPARAMETER WB '((HALLWAY EAST OFFICE) (OFFICE WEST HALLWAY) (OFFICE NORTH KITCHEN) (KITCHEN SOUTH OFFICE) (BEDROOM WEST GARDEN) (GARDEN EAST BEDROOM) (GARDEN WEST OFFICE) (OFFICE EAST GARDEN) (GARDEN NORTH BATHROOM) (BATHROOM SOUTH GARDEN) (LAVATORY SOUTH BEDROOM) (BEDROOM NORTH LAVATORY) (LAVATORY WEST BATHROOM) (BATHROOM EAST LAVATORY) (BATHROOM WEST KITCHEN) (KITCHEN EAST BATHROOM) (STUDIO EAST KITCHEN) (KITCHEN WEST STUDIO) (STUDIO SOUTH HALLWAY) (HALLWAY NORTH STUDIO)))

(REMOVE '(BATHROOM EAST KITCHEN) WB) ;should throw (BATHROOM EAST KITCHEN) out of WB but does not work 
(REMOVE '(1 2 3) '((4 5 6) (1 2 3)))
My expected result is ((4 5 6))
But the output is ((4 5 6) (1 2 3))
核心转储

中的:test关键字参数的默认值REMOVE(通常是接受测试功能参数的功能)的默认值为EQL

在编写时(remove '(1 2 3) '((1 2 3) (4 5 6))),您不能保证打印出的两个列表(1 2 3)相同它们可能由不同的缺点单元表示:

(eql '(1 2 3) '(1 2 3))
=> NIL

编译器可以在编译时检测到两个列表相等,并使用相同的基础内存,从而使它们相等,但您通常不能假设是这种情况。

但是,如果您使用两次相同的列表,则REMOVE可以按预期工作:

(let ((a '(1 2 3))) (remove a (list a '(4 5 6))))
=> ((4 5 6))

上面的示例也可以使用读取器变量编写如下(结果相似,但整个列表被引用,而不是在运行时使用创建list):

(remove '#1=(1 2 3) '(#1# (4 5 6)))
=> ((4 5 6))

在一般情况下,当您不按对象的身份操作对象时,需要使用一个知道如何比较列表的测试函数,以便将具有相同内容的不同列表视为相等:

(remove '(1 2 3) '((1 2 3) (4 5 6)) :test #'equal)
=> ((4 5 6))

通过以上代码,将元素与进行比较EQUAL

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章