首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在clojure中合并两个序列?

如何在clojure中合并两个序列?
EN

Stack Overflow用户
提问于 2012-09-30 11:15:16
回答 5查看 39.4K关注 0票数 31

在Clojure中合并(或检索两个列表(或序列)的并集)的惯用方法是什么?

代码语言:javascript
复制
(merge l1 l2)

似乎不是解决之道:

代码语言:javascript
复制
a=> (merge '(1 2 3) '(2 3 4))
((2 3 4) 1 2 3)
EN

回答 5

Stack Overflow用户

发布于 2012-09-30 14:11:46

我认为andih的解决方案效果很好。这是另一种方式,因为嘿,为什么不呢?它使用concatdistinct

代码语言:javascript
复制
user> (distinct (concat '(1 2 3) '(2 3 4)))
=> (1 2 3 4)
票数 29
EN

Stack Overflow用户

发布于 2012-10-01 05:26:35

如果您想要的实际上是不同的未排序数据(集合),那么您应该使用Clojure的集合数据结构,而不是向量或列表。正如andih间接建议的那样,有一个用于集合操作的核心库:http://clojure.github.com/clojure/clojure.set-api.html

代码语言:javascript
复制
(require '[clojure.set :refer [union]])

(union #{1 2 3} #{3 4 5})
=> #{1 2 3 4 5}

如果sets出于某种原因不是你想要的,那么继续往下读。当序列中有大量数据时,要小心使用concat,并考虑使用into,它作为矢量合并算法进行了更好的优化。我不知道为什么没有使用into实现concat (或者更好的是--为什么concat还存在?顺便说一句,虽然into比concat快很多,但它仍然比conj慢得多。Bagwell的RRB树,兼容Clojure和Scala,将解决这个问题,但还没有为Clojure实现)。

将Omri的非集合解决方案重新表述为“into”:

代码语言:javascript
复制
(distinct (into [1 2 3] [3 4 5]))
=> (1 2 3 4 5)
票数 15
EN

Stack Overflow用户

发布于 2012-09-30 12:01:01

获得两个列表并集的一种方法是使用union

代码语言:javascript
复制
Clojure> (into #{} (clojure.set/union '(1,2,3) '(3,4,5)))
#{1 2 3 4 5}

或者如果你想要一个列表

代码语言:javascript
复制
(into '() (into #{} (clojure.set/union '(1,2,3) '(3,4,5))))
(5 4 3 2 1)
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12658341

复制
相关文章

相似问题

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