没有相同值的 Common Lisp 排列对

Common Lisp permutation pairs without identical values

我正在尝试创建一个函数,给定一个列表,该函数将 return 一个元素对列表,其中两个元素不相等。例如,给定列表 (1 2 3) 它将 return ((1 2) (1 3) (2 1) (2 3) (3 1) (3 2))。我现在的代码可以工作,但是它会在每个应该有匹配数字的地方添加 nil ; (1 1) 例如。

(defun make-permutations-without-identical(list)
(loop for x in list
  append (loop for y in list
               collect (append (if (not (equal x y)) (list x y))))))

此代码,给定 (1 2 3) returns (NIL (1 2) (1 3) (2 1) NIL (2 3) (3 1) (3 2) NIL)。我如何摆脱 NIL?

如果您不想在结果列表中看到 NIL,请不要收集 NIL。 仅收集 您希望出现在结果列表中的项目。

由于内部循环生成的列表是新鲜的,您可以 nconc 它们。 loop 宏有 unless 部分,因此您可以有条件地 collect 部分。因此你可以 collect 除非 (equal x y):

CL-USER> (loop for x in '(1 2 3)
              nconcing (loop for y in '(1 2 3)
                            unless (equal x y)
                            collect (list x y)))
((1 2) (1 3) (2 1) (2 3) (3 1) (3 2))