使用另一个地图列表中的匹配值更新地图值列表

时间:2014-06-02 11:12:59

标签: map clojure

我有两个类似于下面的数据集。我试图将map2中的id值更新为map1中相应的di2值。

map1({id1:1 value:2 :valueb:4 id2:a}{id1:2 value:2 :valueb:4 id2:b}{id1:3 value:2 :valueb:4 id2:c})
map2({id:1 x:1 y:2}{id:2 x:4 y:6}{id:3 x:1 y:3})

所以输出看起来像是:

map3({id:a x:1 y:2}{id:b x:4 y:6}{id:c x:1 y:3})

任何帮助表示感谢,不知道该怎么做...

谢谢, d

1 个答案:

答案 0 :(得分:2)

假设您的数据确实是

(def map1 (list {:id1 1, :value 2, :valueb 4, :id2 'a}
                {:id1 2, :value 2, :valueb 4, :id2 'b}
                {:id1 3, :value 2, :valueb 4, :id2 'c}))

(def map2 (list {:id 1, :x 1, :y 2}
                {:id 2, :x 4, :y 6}
                {:id 3, :x 1, :y 3}))

......然后

(let [im (into {} (map (juxt :id1 :id2) map1))]
  (map #(assoc % :id (im (% :id))) map2))

...产生你想要的东西:

; ({:y 2, :x 1, :id a} {:y 6, :x 4, :id b} {:y 3, :x 1, :id c})

首先,我们在im中构建map1所需翻译的地图;然后我们将其按地图应用到:id中的map2条目。

这显然是关系代数的事情,但我无法找到适合的标准函数或函数组合。 Here可能是一个合理的地方。