use*_*206 29 sequences clojure
在Clojure中合并(或检索联合)两个列表(或序列)的惯用方法是什么?
(merge l1 l2)
Run Code Online (Sandbox Code Playgroud)
似乎不是解决方案:
a=> (merge '(1 2 3) '(2 3 4))
((2 3 4) 1 2 3)
Run Code Online (Sandbox Code Playgroud)
Omr*_*ein 28
我认为andih的解决方案效果很好.这是另一种方式,因为嘿,为什么不呢.它使用concat和 distinct:
user> (distinct (concat '(1 2 3) '(2 3 4)))
=> (1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
and*_*dih 14
获得两个列表联合的一种方法是使用 union
Clojure> (into #{} (clojure.set/union '(1,2,3) '(3,4,5)))
#{1 2 3 4 5}
Run Code Online (Sandbox Code Playgroud)
或者如果你想获得一份清单
(into '() (into #{} (clojure.set/union '(1,2,3) '(3,4,5))))
(5 4 3 2 1)
Run Code Online (Sandbox Code Playgroud)
rpl*_*evy 14
如果你想要的实际上是不同的未排序数据(集合),你应该使用Clojure的集合数据结构而不是向量或列表.正如andih间接建议的那样,有一个用于集合操作的核心库:http://clojure.github.com/clojure/clojure.set-api.html
(require '[clojure.set :refer [union]])
(union #{1 2 3} #{3 4 5})
=> #{1 2 3 4 5}
Run Code Online (Sandbox Code Playgroud)
如果套装出于任何原因而不是你想要的,请继续阅读.concat当您的序列中有大量数据时要小心,并考虑使用into哪个更好地优化为矢量合并算法.我不知道为什么concat没有使用into实现(或者更好 - 为什么concat甚至存在?BTW虽然明显快于concat,但它仍然比conj.Bagwell的RRB树慢,与Clojure兼容和Scala,将解决这个问题,但尚未实现Clojure).
用'into'来改写Omri的非设定解决方案:
(distinct (into [1 2 3] [3 4 5]))
=> (1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)
如果你不介意重复,你可以试试concat:
(concat '(1 2 3 ) '(4 5 6 1) '(2 3))
;;==> (1 2 3 4 5 6 1 2 3)
Run Code Online (Sandbox Code Playgroud)