如果它們在兩個給定列表中,我該如何返回元素?如果它們在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兩個列表中和,然後元件,附加所得列表
如果它們在兩個給定列表中,我該如何返回元素?如果它們在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兩個列表中和,然後元件,附加所得列表
可以利用哈希表開始,映射列表元素到一對,第一個是第一個列表中的元素,第二個是第二個元素。然後你收集的元素:
(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)
注意,在其中返回列表中的元素的順序定義不。
我已將'l1 l1'更改爲'l1 l2'作爲函數的參數,並用'(common-elements'(abc)'(bbc))嘗試了' 錯誤返回:*** - NCONC: C不是列表 –
考慮將代碼固定爲作業的一部分。 ;-) – sds
來自Stackoverflow的幫助:「要求作業幫助的問題必須包括您迄今爲止解決問題所做的工作摘要,以及描述您解決問題的難度。」 –