【发布时间】:2017-06-28 21:09:39
【问题描述】:
我想用两个给定的列表删除不在两个列表中的元素。
我正在尝试的代码是:
(defun remove_odd_ones(L1 L2)
(cond ((or (null L1) (null L2)) nil)
((dolist (x L2) (if (not(member x L1)) (remove x L2))))))
(remove_odd_ones '(a b c c e k) '(a b c p d d n))
我的期待:(a b c c)
我收到的结果:NIL
知道我可以使用什么函数将dolist 结果保存到新列表中吗?
【问题讨论】:
-
remove表示从其他东西中删除某些东西,但是从您的描述和从您的示例中,您不清楚您的任务是什么需要解决。您想生成两个列表中都存在的元素吗?但是,为什么k不存在于结果中,而d存在?它们都只在一个列表中。 -
你说得对,我确实打错了 ir。预期的结果将只是 (a b c)。也就是说,属于 L2 的元素也会出现在 L1 中。
-
你不是说这两个集合的交集吗?这是 CL 当然有一个功能。但是,请注意,由于您的列表中有重复项,您将在结果中得到重复项。还有一个函数可以处理这个问题。如果这是家庭作业并且您必须使用 dolist 编写函数,那么 dolist 的语法是 (dolist ( var list [result-form]) statements)。在 CLHS 中查找示例 dolist lispworks.com/documentation/HyperSpec/Body/m_dolist.htm
-
实际上,我需要保留重复项,所以'intersect' 函数对我来说是完美的,非常感谢。
-
显示的结果(a b c d d)是打字错误,我期待的结果真的是(a b c c),我现在编辑了这个问题,以防止更多的错误。关于函数:正如 David Hodge 所建议的那样,“intersection”函数正是我想知道的,我在代码中使用了这里并得到了我想要的所有结果。非常感谢大家。
标签: lisp common-lisp