我有一个列表列表,想要测试所有元素是否彼此不同,即对于列表元素的所有组合,则equal应返回nil。
E.g。
(defparameter feld '((1 0 0 5 5 0)
(0 0 0 0 0 0)
(1 1 5 5 0 0)
(0 1 0 1 5 5)
(5 5 1 0 1 0)
(1 0 1 0 5 5)))
我想过使用reduce,但据我所知,它只测试邻居的相等性,就像一个循环结构一样:
(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)))))
答案 0 :(得分:4)
这样的事情:
(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)))