私はclojureでハッシュマップを作成しました:
{"key1" "value1"} {"key2" "value2"} {"key3" "value1"}
そして、それをのハッシュマップに変換する必要があります
{"value1" {"key1" "key3"}} {"value2" {"key2"}}
これを行うためのクロージュアの方法はありますか?
clojure.set/map-invert は、繰り返される値をオーバーライドするかのように機能しません。
私はclojureでハッシュマップを作成しました:
{"key1" "value1"} {"key2" "value2"} {"key3" "value1"}
そして、それをのハッシュマップに変換する必要があります
{"value1" {"key1" "key3"}} {"value2" {"key2"}}
これを行うためのクロージュアの方法はありますか?
clojure.set/map-invert は、繰り返される値をオーバーライドするかのように機能しません。
(def m {"key1" "value1" "key2" "value2" "key3" "value1"})
(let [g (group-by val m)
vals (map #(map first %) (vals g))]
(zipmap (keys g) vals))
;;=> {"value2" ("key2"), "value1" ("key1" "key3")}
これを試してください:
(def m {"key1" "value1" "key2" "value2" "key3" "value1"})
(reduce (fn [a x] (assoc a (second x) (conj (a (second x)) (first x)))) {} m)
=> {"value2" ("key2"), "value1" ("key3" "key1")}
(おそらく) 繰り返される値がリストになることに注意してください。または、コメントで@A.Webbが示唆しているように、上記は次のように簡潔に書くことができます。
(reduce (fn [a [k v]] (update-in a [v] conj k)) {} m)
=> {"value2" ("key2"), "value1" ("key3" "key1")}
あなたの質問は本当に紛らわしいです。最初にあなたはハッシュマップを持っていると言いました、あなたが実際に例として持っているのは多くのハッシュマップです、あるいはあなたが本当に単一のハッシュマップを意味するならあなたの例はそれがあるべきであるように間違っています{"key1" "value1" "key2" "value2" "key3" "value1"}
。第二に、必要な出力は、ハッシュマップの値がマップ自体として表されるという意味で奇妙ですが、最後の値はハッシュマップの単一の値であり、明らかに不可能なので、値を意味していると思います(マップではなく)として設定されます
{"value1" #{"key1" "key3"}} {"value2" #{"key2"}}
これらすべての仮定に基づくと、考えられる解決策の1つは次のとおりです。
(->> {"key1" "value1" "key2" "value2" "key3" "value1"}
(group-by second)
(map #(-> [(%1 0) (into #{} (map first (%1 1)))]))
(into {}))
別の方法を次に示します。
(def maps [{"key1" "value1"} {"key2" "value2"} {"key3" "value1"}])
(into {}
(for [[k v] (group-by #(val (first %)) maps)]
[k (apply concat (map keys v))]))
;=> {"value1" ("key1" "key3"), "value2" ("key2")}
以下を試してください。テストするREPLがありません。元の回答とは少し異なる場合がありますが、それを使用して必要なものを取得できます。
(group-by #(val (first %)) {"key1" "value1"} {"key2" "value2"} {"key3" "value1"})