gpt4 book ai didi

list - 试图从第二个列表中删除第一个列表中指定的重复原子

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

我正在尝试编写一个像 remove-duplicates 一样工作的函数,但它需要两个列表作为输入,第一个指定不允许重复的字符,第二个是各种原子的列表被修剪。

目前我有这个:

(defun like-remove-duplicates (lst1 lst2)
(if(member (first lst1) lst2)
(remove-if #'(lambda (a b)
(equals a b))lst1 lst2)))

我知道它离正确的地方不远,但我不知道我需要做什么才能执行此功能。我知道我基本上需要检查 list1 中的第一项是否在 list2 中,如果是,则删除其重复项(但保留一个),然后移至第一个列表中的下一项。我设想了递归,但结果并不好。我试过研究,但无济于事。

有什么帮助吗?

最佳答案

CL-USER> (defun remove-duplicates-from-list (forbidden-list list)
(reduce (lambda (x y)
(let ((start (position y x)))
(if start
(remove y x :start (1+ start))
x)))
forbidden-list
:initial-value list))
REMOVE-DUPLICATES-FROM-LIST

CL-USER> (remove-duplicates-from-list '(1 2) '(1 2 1 3))
(1 2 3)
CL-USER> (remove-duplicates-from-list '(1 2) '(1 2 1 3 2))
(1 2 3)
CL-USER> (remove-duplicates-from-list '(1 2) '(1 2 1 3 2 4))
(1 2 3 4)
CL-USER> (remove-duplicates-from-list '(2 1) '(1 2 1 3 2 4))
(1 2 3 4)
CL-USER> (remove-duplicates-from-list '(2 1) '(0 1 2 1 3 2 4))
(0 1 2 3 4)
CL-USER> (remove-duplicates-from-list '(2 1) '(0 2 3 2 4))
(0 2 3 4)
CL-USER> (remove-duplicates-from-list '(2 1) '(0 2 2 3 4))
(0 2 3 4)

递归由 reduce 执行(因为这里我们有最常见的递归模式:将上一次迭代的结果提供给下一次迭代)并且 removeing 是通过:start 参数的帮助,即当前被移除的值在第一次遇到(由位置找到)后的偏移量。

当未找到值且 position 返回 nil 时,考虑大小写也很重要。

关于list - 试图从第二个列表中删除第一个列表中指定的重复原子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7643951/

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