如果元素在lisp中的两个给定列表中,则返回它们

如果元素在lisp中的两个给定列表中,则返回它们,lisp,Lisp,如果元素位于两个给定列表中,如何返回它们 例如: L1 = (a b c d e a b c) L2 = (a d f g k c c) Result = (a a a c c c c d d) 我想删除两个列表中都不存在的元素,然后追加结果列表。您可以从一个哈希表开始,将列表元素映射到一对,第一个是第一个列表中的元素,第二个是第二个列表中的元素。然后收集元素: (defun common-elements (l1 l2 &key (test 'eql)) (let ((ht

如果元素位于两个给定列表中,如何返回它们

例如:

L1 = (a b c d e a b c)

L2 = (a d f g k c c)

Result = (a a a c c c c d d)

我想删除两个列表中都不存在的元素,然后追加结果列表。您可以从一个哈希表开始,将列表元素映射到一对,第一个是第一个列表中的元素,第二个是第二个列表中的元素。然后收集元素:

(defun common-elements (l1 l2 &key (test 'eql))
  (let ((ht (make-hash-table :test test)) ret)
    (dolist (e l1)
      (let ((pair (gethash e ht)))
        (if pair
            (push e (car pair))
            (setf (gethash e ht) (cons (list e) nil)))))
    (dolist (e l2)
      (let ((pair (gethash e ht)))
        (when pair ; no need to store e when it is not in l1
          (push e (cdr pair)))))
    (maphash (lambda (e pair)
               (declare (ignore e))
               (when (cdr pair) ; we know (car pair) is non-nil
                 (setq ret (nconc (car pair) (cdr pair) ret))))
             ht)
    ret))
(common-elements '(a b c d e a b c) '(a d f g k c c))
==> (A A A C C C C D D)

请注意,列表元素的返回顺序没有定义。

您可以从一个哈希表开始,将列表元素映射到一对,第一个是来自第一个列表的元素,第二个是来自第二个列表的元素。然后收集元素:

(defun common-elements (l1 l2 &key (test 'eql))
  (let ((ht (make-hash-table :test test)) ret)
    (dolist (e l1)
      (let ((pair (gethash e ht)))
        (if pair
            (push e (car pair))
            (setf (gethash e ht) (cons (list e) nil)))))
    (dolist (e l2)
      (let ((pair (gethash e ht)))
        (when pair ; no need to store e when it is not in l1
          (push e (cdr pair)))))
    (maphash (lambda (e pair)
               (declare (ignore e))
               (when (cdr pair) ; we know (car pair) is non-nil
                 (setq ret (nconc (car pair) (cdr pair) ret))))
             ht)
    ret))
(common-elements '(a b c d e a b c) '(a d f g k c c))
==> (A A A C C C C D D)

请注意,列表元素的返回顺序没有定义。

我已将
l1l1
更改为
l1l2
作为函数的参数,并使用
(common elements'(abc)'(bbc))
尝试返回错误:**-ncoc:c不是一个列表考虑将代码修复为作业的一部分。;-)我已将
l1-l1
更改为
l1-l2
作为函数的参数,并尝试使用
(common elements'(ab c)'(b b b c))
返回错误:**-NCONC:c不是列表考虑将代码修复为作业的一部分;-)来自Stackoverflow帮助:“请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做工作的摘要,以及您在解决问题时遇到的困难的描述。”来自Stackoverflow帮助:“要求家庭作业帮助的问题必须包括到目前为止你为解决问题所做工作的摘要,以及对你解决问题的困难的描述。”