首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要连接两个列表,对它们进行排序并删除重复项。有没有更好的方法来做这件事?

我需要连接两个列表,对它们进行排序并删除重复项。有没有更好的方法来做这件事?
EN

Stack Overflow用户
提问于 2008-09-19 06:29:19
回答 6查看 3.5K关注 0票数 6

我有两个未排序的列表,我需要生成另一个排序的列表,其中所有元素都是唯一的。

元素可以在两个列表中多次出现,并且它们最初是未排序的。

我的函数如下所示:

代码语言:javascript
复制
(defun merge-lists (list-a list-b sort-fn)
    "Merges two lists of (x, y) coordinates sorting them and removing dupes"
    (let   ((prev nil))
        (remove-if
            (lambda (point)
                (let   ((ret-val (equal point prev)))
                    (setf prev point)
                    ret-val))
            (sort
                (merge 'list list-a list-b sort-fn) ;'
                 sort-fn))))

有没有更好的方法来实现同样的目标?

示例调用:

代码语言:javascript
复制
[CL]> (merge-lists '(9 8 4 8 9 7 2) '(1 7 3 9 2 6) #'>)
  ==> (9 8 7 6 4 3 2 1)
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-09-19 06:49:24

我们的邻居友好的Lisp专家指出了remove-duplicates function

他还提供了以下代码片段:

代码语言:javascript
复制
(defun merge-lists (list-a list-b sort-fn test-fn)
    (sort (remove-duplicates (append list-a list-b) :test test-fn) sort-fn))
票数 11
EN

Stack Overflow用户

发布于 2008-09-19 06:38:59

我想我会首先对两个列表分别排序,然后将它们合并到一个也可以跳过重复项的函数中。这应该会更快一点,因为它需要更少的遍历两个列表。

附言:我怀疑它能做得更快,因为你基本上总是需要至少一个排序和一个合并。也许您可以在一个函数中结合使用这两个函数,但如果这不会造成(很大的)差异,我也不会感到惊讶。

票数 1
EN

Stack Overflow用户

发布于 2008-09-19 06:54:29

如果在合并列表之前对列表进行了排序,则可以同时合并、删除重复项和进行排序。如果它们已排序且无重复,那么merge/sort/duplicate-remove功能就变得非常简单。

实际上,更改插入函数可能会更好,这样它就可以执行排序插入来检查重复项。然后,您总是拥有没有重复项的排序列表,合并它们是一件微不足道的事情。

不过,您可能更喜欢使用快速插入函数,但代价是以后要对重复项进行排序/删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/100048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档