Lisp 测试列表中的所有元素是否彼此不同
我有一个列表,希望测试所有元素是否彼此不同,即对于列表元素的所有组合,equal应该返回nil 例如 我曾想过使用reduce,但据我所知,它只测试邻居的相等性,就像循环构造一样:Lisp 测试列表中的所有元素是否彼此不同,lisp,common-lisp,Lisp,Common Lisp,我有一个列表,希望测试所有元素是否彼此不同,即对于列表元素的所有组合,equal应该返回nil 例如 我曾想过使用reduce,但据我所知,它只测试邻居的相等性,就像循环构造一样: (loop for i below (length feld) for j from 1 if (equal (nth i feld) (nth j feld)) return t) 有没有一种简单的方法可以使用我目前没有看到的标准构造,或者我必须创建一个递归函数 整个数据结构表
(loop for i below (length feld)
for j from 1
if (equal (nth i feld) (nth j feld)) return t)
有没有一种简单的方法可以使用我目前没有看到的标准构造,或者我必须创建一个递归函数
整个数据结构表示一个“棋盘游戏”,其中每个列表都是棋盘上的一条线,内部列表中的每个元素都是该字段的值。三个数值(0、1和5)类似于空、符号A和符号B。一个有效板不能有两条相同的线。这就是为什么我想确定这些
基本上,这就像删除重复项而不删除。与此同时,我在想这样的事情:
(defun duplicates-p (lst)
(cond ((null lst) '())
((member (car lst) (cdr lst)) t)
(t (duplicates-p (rest lst)))))
(defun unique (lsts &aux (h (make-hash-table :test 'equal)))
(loop :for lst :in lsts
:never (gethash lst h)
:do (setf (gethash lst h) t)))
大概是这样的:
(defun duplicates-p (lst)
(cond ((null lst) '())
((member (car lst) (cdr lst)) t)
(t (duplicates-p (rest lst)))))
(defun unique (lsts &aux (h (make-hash-table :test 'equal)))
(loop :for lst :in lsts
:never (gethash lst h)
:do (setf (gethash lst h) t)))
大概是这样的:
(defun duplicates-p (lst)
(cond ((null lst) '())
((member (car lst) (cdr lst)) t)
(t (duplicates-p (rest lst)))))
(defun unique (lsts &aux (h (make-hash-table :test 'equal)))
(loop :for lst :in lsts
:never (gethash lst h)
:do (setf (gethash lst h) t)))
我发现这里的
finally
子句是多余和令人困惑的。虽然给定的问题不需要它,但更一般的函数将测试gethash
的第二个返回值,而不是第一个,因此,空列表也不能出现两次。@svante两个空列表将正确计算为nil
,因为每个当前键的值都是t
。实际上,最终不需要了。当我将if
替换为never
时,我没有考虑删除它。你说得对,我没有正确阅读。我的直觉是将项目本身保存在哈希表中,并测试是否存在,而不是值。这也有助于修改它,以显示错误消息中哪个值是“违犯者”。我发现这里的finally
子句是多余和混乱的。虽然给定的问题不需要它,但更通用的函数将测试gethash
的第二个返回值,而不是第一个返回值,因此,空列表也不能出现两次。@svante两个空列表将正确计算为nil
,因为每个当前键的值都是t
。实际上,最终不需要了。当我将if
替换为never
时,我没有考虑删除它。你说得对,我没有正确阅读。我的直觉是将项目本身保存在哈希表中,并测试是否存在,而不是值。这也有助于修改它,以显示错误消息中哪个值是“违犯者”。