Common Lisp置换对没有相同的值

问题描述 投票:0回答:2

我正在尝试创建一个函数,给定一个列表,将返回两个元素不相等的元素对的列表。例如,给定列表(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?

common-lisp permutation
2个回答
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))

0
投票

如果您不想在结果列表中看到NIL,则不要收集NIL。仅收集您想要在结果列表中的项目。

© www.soinside.com 2019 - 2024. All rights reserved.