gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:25 25 4
gpt4 key购买 nike

如果元素在两个给定列表中,我如何返回它们?

示例:

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)

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

关于lisp - 如果元素在 lisp 中的两个给定列表中,则返回元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44793126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com