gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:52:44 26 4
gpt4 key购买 nike

我有一个非常简单的 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")

给出 type-error健康)状况。但请注意,
(string= "FOO" :FOO)

定义得很好( string= 和它的 friend 是根据“字符串指示符”而不是字符串定义的),所以类型安全在这里只能走这么远。

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

对于更多 Pythonic 倾向, eql (和 eq 用于非数字类型)更像 eql运算符,而 is更像 equal调用 == .

关于common-lisp - 从列表中删除重复的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7937938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com