list - LISP:从另一个列表中已存在的元素中删除元素

标签 list duplicates lisp project remove-if

谁能向我解释一下为什么会这样:

(remove-if #'(lambda (var) (member var (list "x"))) (list "x" "y" "z"))

返回:

("x" "y" "z")

但是这个:

(remove-if #'(lambda (var) (member var (list 1))) (list 1 2 4))

返回:

(2 4)

最佳答案

答案

:test #'equal 传递给 member :

(remove-if #'(lambda (var) (member var (list "x") :test #'equal)) (list "x" "y" "z"))
==> ("y" "z")

请注意

(eql "x" "x")
==> NIL
(equal "x" "x")
==> T
(eql 1 1)
==> T

原因

默认One-Argument Test in Common Lisp is eql .

这是 ANSI CL 标准提供的 4(!) 个通用比较函数之间最合理的选择:

  • eq过于依赖于实现,并且不能像人们可能想要的数字和字符那样工作
  • equalequalp遍历对象,因此对于大型对象来说需要很长时间,对于圆形对象可能永远不会终止。

另请参阅the difference between eq, eql, equal, and equalp in Common Lisp .

正确的方法

使用set-difference而不是 remove-if + member

关于list - LISP:从另一个列表中已存在的元素中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835587/

相关文章:

python - 如何从列表中随机选择项目,同时避免连续选择相同的项目

c++ - 为什么在另一个文件中声明此公共(public)成员函数时会得到重复的符号? (C++)

emacs - 如何制作 Emacs 键绑定(bind)来设置变量?

python - 如何在 Python 的集合列表中找到并集?

java - 更改java中LinkedList中元素的值

r - 从列表转换为数字

Mysql:创建具有多个自联接的 View ,结果不重复

Python 抓取删除重复项

haskell - 柯里化(Currying)带有 n(3 个或更多)参数的函数?

clojure - 在 Clojure 中声明匿名函数是否很昂贵?