从列表中删除重复的字符串

2023-11-27

我有一个非常简单的 Common Lisp 问题:从字符串列表中删除重复项的惯用方法是什么?

remove-duplicates正如我对数字的期望,但不适用于字符串:

* (remove-duplicates '(1 2 2 3))

(1 2 3)

* (remove-duplicates '("one" "two" "two" "three"))

("one" "two" "two" "three")

我猜字符串在某种程度上不相等,很可能是因为尽管“foo”和“foo”表面上相同,但它们实际上是指向内存中不同结构的指针。我想我在这里的期望可能只是C宿醉。


您必须告诉remove-duplicates 它应该如何比较这些值。默认情况下,它使用eql,这对于字符串来说是不够的。通过:test函数如下:

(remove-duplicates your-sequence :test #'equal). 

(编辑以解决评论中的问题):作为替代方案equal,你可以使用string=在这个例子中。这个谓词(在某种程度上)不如equal它可能(可能,可能,可能,最终......)因此更快。真正的好处可能是string=如果您传递了错误的值,可以告诉您:

(equal 1 "foo")

愉快地收获nil, 然而

(string= 1 "foo")

gives a type-error健康)状况。但请注意,

(string= "FOO" :FOO)

是完全明确定义的(string=及其朋友是根据“字符串指示符”而不是字符串来定义的),因此类型安全在这里只能进行到此为止。

标准eql另一方面,谓词几乎从来都不是比较字符串的正确方法。如果您熟悉 Java 语言,请考虑eql作为使用== while equal (or string=等)调用equals(Object)方法。尽管eql进行某种类型内省(而不是eq,但没有),对于大多数(非数字)lisp 类型,eql归结为类似指针比较的东西,如果您想根据值实际包含的内容而不是仅仅根据它们在内存中的位置来区分值,那么这是不够的。

对于更Pythonic倾向的人来说,eq (and eql对于非数字类型)更像是is运算符,而equal更像是==哪个调用__eq__.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从列表中删除重复的字符串 的相关文章

  • 在 LISP 中是否可以访问函数的形式?

    假设我全局定义了一个函数 defun x y 1 y Edit my first example was too complicated 是否可以将函数 x 强制 到一个列表中 例如 x y 1 y 提前致谢 PS Danlei 的示例在
  • Common lisp:有没有一种不那么痛苦的方法来输入数学表达式?

    我喜欢 Common lisp 但有时输入简单的数学表达式真的很痛苦 a 8b 2 1 4bc 4b 2 1 当然我可以转换它 但是有点慢 我先写 然后在每个括号中写 我想知道这里是否有人知道更好的输入方法 我正在考虑编写一个数学宏 其中
  • 如何在创建实例期间强制检查插槽的类型?

    假设我有以下类声明 defclass foo class bar initarg bar type list 当我创建这个类的实例时 make instance不会检查传递的参数是否满足槽类型 所以 我可以这样创建 无效 对象 gt mak
  • MOP:访问任何插槽定义? (mito柱型)

    我定义了一个使用 Mito ORM 的类 插槽定义了一个 col type isbn accessor isbn initarg isbn col type or varchar 128 null 如何获得 col type定义 由于这是我
  • 在 Lparallel 库中使用队列 (Common Lisp)

    lparallel 库中队列的基本讨论位于https z0ltan wordpress com 2016 09 09 basic concurrency and parallelism in common lisp part 4a para
  • Common Lisp:如何使用条件拼接在宏中构建列表?

    我们假设 defmacro testing optional var list this is when consp var a list 当被调用时 gt testing 2 THIS IS gt testing list 1 2 THI
  • (撰写)Common Lisp

    我们在 P Graham 的 ANSI Common Lisp 第 110 页 中找到了这个函数构建器来实现组合 参数是 n gt 0 带引号的函数名称 我不完全理解它 所以我将在这里引用代码并在下面指出我的问题 defun compose
  • 在 LISP 中使用“ash”执行二分查找?

    所以 我现在正在阅读 Land of Lisp 事实证明 Lisp 与我见过的其他编程语言有很大不同 无论如何 本书提供了一些我们要输入到 CLISP REPL 中的代码 defparameter small 1 defparameter
  • Common Lisp 中的未绑定变量

    我是 Lisp 新手 正在阅读 ANSI Common Lisp 第 8 章中的文本生成器示例 我按照该示例并在 LET 变量 prec 的范围内定义了一个函数 see let prec defun see symb let pair as
  • Clozure Common Lisp - TCP 套接字编程 - 发送回复

    我有一个非常小的程序 它打开一个套接字并接受一个连接 然后它会获取远程 IP 和端口 我想向远程计算机 telnet 发送一条短信并关闭连接 我无法确定哪个函数用于向 telnet 客户端发送消息 The Clozure手册 http cc
  • Common Lisp 中重置状态

    新手 Common Lisp 问题在这里 有没有办法重置环境状态 我的意思是 是否有一些命令可以使 REPL 恢复到启动后的相同状态 即取消所有变量 函数等 或者如果这不在 Common Lisp 标准中 是否有一些扩展在 SBCL 我使用
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 对于案例,这些表达案例的方法中哪种最好?

    这些都有效 defun testcaseexpr thecase case thecase foo format t matched foo bar format t matched bar funk format t matched fu
  • 使用包阴影符号

    例如 我有这个包定义 它遮蔽了 COMMON LISP LISTEN defpackage shadows use common lisp shadow listen export listen 然后我想使用另一个包中的这个包 比如说 de
  • 在Emacs中,这个错误是什么意思? “警告:运行时需要 cl 包”

    我正在字节编译一个模块 它给了我这个警告 Warning cl package required at runtime 为什么这是一个警告 我很清楚我正在使用cl包裹 事实上有一个 require cl 模块中的语句 使用有什么问题吗cl
  • windows下无法用emacs + sbcl启动slime

    我想配置我的 emacs 以使用 SLIME 和 SBCL emacs 文件如下所示 add to list load path D app slime setq inferior lisp program sbcl require sli
  • 修改功能;保存到 Lisp 中的新函数

    所以我认为 lisp 在其他语言中 的优点之一是它能够实现函数工厂 接受函数作为参数 返回新函数 我想使用此功能对函数进行小的更改并将其保存为新函数 这样如果对原始函数进行更改 它们也会反映在它所基于的新函数中 注意 我不是编写原始函数的人
  • Common Lisp 相当于 format 函数中的 \r 吗?

    基本上 我想只使用 Common Lisp 而不是 Python 来执行以下操作 print Hello world r n 我可以做到这一点 但它只输出 newline字符和跳过 return format t Hello world 我
  • 如何定义所有成员均为给定类型的列表

    我对 CL 类型系统有点陌生 但我认为像下面这样的东西可以工作 deftype list of type labels check all l every lambda item typep item type l and list sat
  • 在 cl-mongo 中实现 MongoDB SASL 身份验证

    我已经从 fons 分叉了 cl mongo common lisp MongoDB 库 存储库 因为它已经不再维护并且不支持 SCRAM SHA 1 登录过程 这是我的叉子 https github com mprelude cl mon

随机推荐