4

私はこれを見てきましたが、それを私の状況に適用する方法がわかりません (しゃれた意図はありません)。

次のようなマップのソートされたリストがあります: (マップには2つ以上のキーが存在する可能性があることに注意してください) ({name1 3, name2 7}, {name1 35, name2 7}, {name1 0, name2 3})

私が求めているのは、その後のこのデータ構造です:

({:名前1 [3,35,0]}, {:名前2 [7,7,3]})

私はしばらくこれに苦労してきましたが、どこにも近づくことができないようです.

警告: データはソートされたままにしておく必要があり、2 つだけでなく N 個のキーワードがあります。

4

3 に答える 3

2

私はmerge-withいくつかの前処理を追加して行きます:

(def maps [{:a :b :e :f} {:a :c} {:a :d :e :g}])
(apply merge-with concat (for [m maps [k v] m] {k [v]}))
>>> {:e (:f :g), :a (:b :c :d)}
于 2012-11-14T16:37:18.907 に答える
1

あなたが望む機能はmerge-withだと思います:

user=> (def x {:a 1 :b 2})
user=> (def y {:a 3 :b 4})
user=> (merge-with vector x y)
{:a [1 3], :b [2 4]}
user=> 
user=> (def z {:a 5 :b 6 :c 7})
user=> (merge-with vector x y z)
{:a [[1 3] 5], :c 7, :b [[2 4] 6]} ; oops
user=> (merge-with #(vec (flatten (vector %1 %2))) x y z)
{:a [1 3 5] :b [2 4 6] :c 7}
user=>
于 2012-11-14T16:05:15.057 に答える
0

これは問題に対する私の試みです。Rafal のソリューションほどエレガントではありません。

(def maps [{:a :b :e :f} {:a :c} {:a :d :e :g}])
(apply merge-with #(if (list? %1) (conj %1 %2) (list %1 %2)) maps)
>>> {:a (:d :b :c), :e (:f :g)}
于 2012-11-15T10:58:28.130 に答える