通过某个映射键合并两个列表

时间:2016-12-14 01:52:38

标签: clojure

我想通过一些地图密钥合并两个列表,如下所示:

(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})

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用joinsort-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})