我想通过一些地图密钥合并两个列表,如下所示:
(def list1 '({:a 2 :b 2} {:a 1 :b 1}))
(def list2 '({:a 1 :c 1} {:a 2 :c 2}))
结果我喜欢类似的东西,使用sort by:a例如:
'({:a 1 :b 1 :c 1} {:a 2 :b 2 :c 2})
有什么想法吗?
答案 0 :(得分:3)
您可以使用join
和sort-by
:
(:require '[clojure.set :as s])
(sort-by :a (s/join list1 list2 {:a :a}))
答案 1 :(得分:1)
这样做吗?
(def list1 '({:a 1 :b 1} {:a 2 :b 2}))
(def list2 '({:a 1 :c 1} {:a 2 :c 2}))
(println
(map merge list1 list2)
)
;=> ({:a 1, :b 1, :c 1} {:a 2, :b 2, :c 2})
更新
(def list1 [ {:a 1 :b 1} {:a 2 :b 2} ] )
(def list2 [ {:a 2 :c 2} {:a 1 :c 1} ] )
(defn sort-merge [lista listb]
(map merge (sort-by :a lista) (sort-by :a listb)))
(println
(sort-merge list1 list2))
;=> ({:a 1, :b 1, :c 1} {:a 2, :b 2, :c 2})
答案 2 :(得分:1)
另一种方法是使用列表理解:
user> (for [x list1
y list2
:when (= (:a x) (:a y))]
(merge x y))
({:a 2, :b 2, :c 2} {:a 1, :b 1, :c 1})