首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure:从另一个映射中创建具有切换键和值的映射

Clojure:从另一个映射中创建具有切换键和值的映射
EN

Stack Overflow用户
提问于 2014-07-01 13:52:32
回答 2查看 559关注 0票数 1

我正在尝试从输入map创建一种恢复索引。我得到的输入地图是:

代码语言:javascript
复制
{"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}}

我想得到另一张地图,结果是:

代码语言:javascript
复制
{"a" ["id-1" "id-2"], "b" ["id-1" "id-2"], "c" ["id-1" "id-2"]}

然而,我认为我的头脑确实疯了,我想我把自己画到了角落里,没有能力跳出框来思考。这是我到目前为止所得到的,看起来它很臭:

代码语言:javascript
复制
(->> {"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来“迭代”我所有的输入值。然后,我使用第二张地图创建一系列如下所示的单独地图:

代码语言:javascript
复制
({"a" "id-2"} {"b" "id-2"} {"c" "id-2"} {"a" "id-1"} {"b" "id-1"} {"c" "id-1"})

为了实现该映射,我使用into [] (repeat ..)创建了一个中间数组,将其与值数组一起输入到映射中。

然后我把它们合并到一起得到我的期望值。

这里有两个问题:

  1. 这看起来真的比我有直觉的要复杂得多
  2. 目前的最终结果还不是很完美,因为我得到了这样的结果: {"a“(\i -d- \1 \ \i -d- \2),"b”(\i -1\ \i -d-2),"c“(\i -d- \1 \ \i - \2)}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 14:24:21

鉴于这一投入:

代码语言:javascript
复制
(def input {"id-1" {"values" ["a" "b" "c"]}, "id-2" {"values" ["a" "b" "c"]}})

更容易做到:

代码语言:javascript
复制
(defn extract [key values]
  (for [v (get values "values")] {v [key]}))

(->> input 
    (mapcat (partial apply extract))
    (apply merge-with concat))

或者,如果没有额外的功能:

代码语言:javascript
复制
(->> (for [[k vs] input]
        (for [v (get vs "values")] {v [k]}))
     (flatten)
     (apply merge-with concat))

就像你想的那样。

诀窍是将key封装在extract函数中的向量中,这样merge-with concat就可以工作,而无需连接字符串。

票数 2
EN

Stack Overflow用户

发布于 2014-07-01 17:10:07

使用地图破坏

代码语言:javascript
复制
(apply merge-with into (for [[k {vs "values"}] input, v vs] {v [k]}))

更清晰

代码语言:javascript
复制
(apply merge-with into
  (for [[k m] input
        v (get m "values")] 
    {v [k]}))
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24512025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档