我正在尝试创建一个函数,给定一个列表,将返回两个元素不相等的元素对的列表。例如,给定列表(1 2 3),它将返回((1 2)(1 3)(2 1)(2 3)(3 1)(3 2))。我现在的代码有效,但它会为每个匹配数字的地点添加nil; (例如,11)。
(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)的该代码返回(NIL(1 2)(1 3)(2 1)NIL(2 3)(3 1)(3 2)NIL)。我该如何摆脱NIL?
由于内循环生成的列表是新鲜的,因此您可以对它们进行nconc。循环宏除非有部分,因此您可以有条件地收集零件。因此你可以收集除了(等于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))
如果您不想在结果列表中看到NIL,则不要收集NIL。仅收集您想要在结果列表中的项目。