4

我已经看到了这一点,但无法弄清楚如何将它(不是双关语)应用于我的情况。

我有一个这样的地图排序列表:(注意地图中可以有两个以上的键)({name1 3,name2 7},{name1 35,name2 7},{name1 0,name2 3})

之后我所追求的是这个数据结构:

({:name1 [3,35,0]}, {:name2 [7,7,3]})

我已经为此苦苦挣扎了一段时间,似乎无法靠近。

警告:数据必须保持排序,我有 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

我认为你想要的功能是合并:

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 回答