2017-06-28 38 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

相關問題