我正在尝试创建一个函数,给定一个列表,将返回两个元素不相等的元素对列表。例如,给定列表(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?
答案 0 :(得分:0)
如果您不想在结果列表中看到NIL,请不要收集 NIL。 仅收集您希望在结果列表中显示的项目。
答案 1 :(得分:0)
由于内循环生成的列表是新鲜的,您可以 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))