2017-06-28 34 views
0

如果它们在两个给定列表中,我该如何返回元素?如果它们在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) 

我想删除的arent两个列表中和,然后元件,附加所得列表

+1

来自Stackoverflow的帮助:“要求作业帮助的问题必须包括您迄今为止解决问题所做的工作摘要,以及描述您解决问题的难度。” –

回答

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) 

注意,在其中返回列表中的元素的顺序定义

+0

我已将'l1 l1'更改为'l1 l2'作为函数的参数,并用'(common-elements'(abc)'(bbc))尝试了' 错误返回:*** - NCONC: C不是列表 –

+2

考虑将代码固定为作业的一部分。 ;-) – sds

相关问题