返回元素,如果它们位于lisp

时间:2017-06-28 03:24:01

标签: 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)

我想删除两个列表中不存在的元素,然后附加结果列表

1 个答案:

答案 0 :(得分:2)

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

(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)

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