List 如何删除包含两个不包含的元素的列表中的元素';你不想要吗?
此函数用于组合任意数量的列表 main函数创建两个列表,一个包含所有可能的玩家、角色和位置组合的列表,以及一个约束列表,其中每个约束列表中的两个变量不能在一起。然后我创建了一个循环,以便在每次迭代中获取一个约束,并从组合的主列表中删除与约束所说的不应该存在的组合相匹配的组合 出于某种原因,remove-it函数只能删除与约束相关的所有内容。例如,一个约束是(Browning penny)。其目的是删除massivecompositions列表中包含Browning和penny两个元素的所有列表。但是,该函数似乎可以删除每个分别包含Browning和penny的列表。我只希望该函数删除包含Browning和Penny的列表List 如何删除包含两个不包含的元素的列表中的元素';你不想要吗?,list,loops,lisp,common-lisp,List,Loops,Lisp,Common Lisp,此函数用于组合任意数量的列表 main函数创建两个列表,一个包含所有可能的玩家、角色和位置组合的列表,以及一个约束列表,其中每个约束列表中的两个变量不能在一起。然后我创建了一个循环,以便在每次迭代中获取一个约束,并从组合的主列表中删除与约束所说的不应该存在的组合相匹配的组合 出于某种原因,remove-it函数只能删除与约束相关的所有内容。例如,一个约束是(Browning penny)。其目的是删除massivecompositions列表中包含Browning和penny两个元素的所有列表。
让我们先缩进
删除它
函数:
(defun remove-it (x y)
(if (and (not (eq (find (nth 0 y) (car x)) nil) (not (eq (find (nth 1 y)(car x)) nil)))) (setq x (remove (car x) x :test #'equal)))
(return x))
就函数而言,这是相当荒谬的。not
函数通常只接受一个参数,在第一次not
调用后,您(很可能)缺少一个右括号
您还只检查了x
的第一个元素,因此如果没有问题,您就不会检查列表的其余部分
变量名不够清晰(“x”和“y”实际上是什么意思)
您不需要显式返回,只需在末尾使用x
作为单个表达式即可
一个可能更好的解决方案可能是(基于我对您实际想要做的事情的理解,即“收集没有两个禁止组合的所有组合”):
您阅读了上一个问题了吗?您似乎仍在犯我已经指出的相同错误。请在
中检查布尔表达式的嵌套,并将其删除。
(defun main()
(setq m-list (combinations '(Blacket Bluet Browning Greenfield Whitehall) '(four-leaf-clover penny rabbit-foot ribbon silver-dollar) '(center-field first-base right-field short-stop third-base)))
(setq constraints (list '(Browning penny) '(Browning silver-dollar) '(Browning right-field) '(Browning center-field) '(Bluet center-field) '(Bluet right-field) '(Greenfield first-base) '(Greenfield short-stop)
'(Greenfield third-base) '(Whitehall center-field) '(Whitehall right-field) '(Greenfield four-leaf-clover) '(Greenfield penny) '(Whitehall four-leaf-clover) '(Whitehall penny)
'(Blacket four-leaf-clover) '(Blacket penny) '(Blacket first-base) '(Blacket third-base) '(Blacket ribbon) '(Bluet ribbon) '(center-field rabbit-foot)))
(loop
(print m-list)
(setq n-constraint (car constraints))
(setq m-list (remove-it m-list n-constraint))
(setq constraints (cdr constraints))
(when (null constraints) (return m-list))))
(defun remove-it (x y)
(if (and (not (eq (find (nth 0 y) (car x)) nil) (not (eq (find (nth 1 y)(car x)) nil)))) (setq x (remove (car x) x :test #'equal)))
(return x))
(defun remove-it (x y)
(if (and (not (eq (find (nth 0 y) (car x)) nil)
(not (eq (find (nth 1 y)(car x)) nil))))
(setq x (remove (car x) x :test #'equal)))
(return x))
(defun remove-constrained-combinations (combinations constraint-1 constraint-2)
(loop for combo in combinations
unless (and (member constraint-1 combinations)
(member constraint-2 combinations)
collect combo))