我正在尝试从输入map创建一种恢复索引。我得到的输入地图是:
{"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}}我想得到另一张地图,结果是:
{"a" ["id-1" "id-2"], "b" ["id-1" "id-2"], "c" ["id-1" "id-2"]}然而,我认为我的头脑确实疯了,我想我把自己画到了角落里,没有能力跳出框来思考。这是我到目前为止所得到的,看起来它很臭:
(->> {"id-1" {"values" ["a" "b" "c"]} "id-2" {"values" ["a" "b" "c"]}}
(map #(->> (get (second %) "values")
(map (fn [x y] (hash-map y x)) (into [] (repeat (count (get (second %) "values")) (first %))))
(apply merge-with concat)))
(apply merge-with concat))基本上,我使用第一个map来“迭代”我所有的输入值。然后,我使用第二张地图创建一系列如下所示的单独地图:
({"a" "id-2"} {"b" "id-2"} {"c" "id-2"} {"a" "id-1"} {"b" "id-1"} {"c" "id-1"})为了实现该映射,我使用into [] (repeat ..)创建了一个中间数组,将其与值数组一起输入到映射中。
然后我把它们合并到一起得到我的期望值。
这里有两个问题:
发布于 2014-07-01 14:24:21
鉴于这一投入:
(def input {"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}})更容易做到:
(defn extract [key values]
(for [v (get values "values")] {v [key]}))
(->> input
(mapcat (partial apply extract))
(apply merge-with concat))或者,如果没有额外的功能:
(->> (for [[k vs] input]
(for [v (get vs "values")] {v [k]}))
(flatten)
(apply merge-with concat))就像你想的那样。
诀窍是将key封装在extract函数中的向量中,这样merge-with concat就可以工作,而无需连接字符串。
发布于 2014-07-01 17:10:07
使用地图破坏
(apply merge-with into (for [[k {vs "values"}] input, v vs] {v [k]}))更清晰
(apply merge-with into
(for [[k m] input
v (get m "values")]
{v [k]}))https://stackoverflow.com/questions/24512025
复制相似问题