我已经看到了这一点,但无法弄清楚如何将它(不是双关语)应用于我的情况。
我有一个这样的地图排序列表:(注意地图中可以有两个以上的键)({name1 3,name2 7},{name1 35,name2 7},{name1 0,name2 3})
之后我所追求的是这个数据结构:
({:name1 [3,35,0]}, {:name2 [7,7,3]})
我已经为此苦苦挣扎了一段时间,似乎无法靠近。
警告:数据必须保持排序,我有 N 个关键字,而不仅仅是两个。
我已经看到了这一点,但无法弄清楚如何将它(不是双关语)应用于我的情况。
我有一个这样的地图排序列表:(注意地图中可以有两个以上的键)({name1 3,name2 7},{name1 35,name2 7},{name1 0,name2 3})
之后我所追求的是这个数据结构:
({:name1 [3,35,0]}, {:name2 [7,7,3]})
我已经为此苦苦挣扎了一段时间,似乎无法靠近。
警告:数据必须保持排序,我有 N 个关键字,而不仅仅是两个。
我会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)}
我认为你想要的功能是合并:
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=>
这是我对这个问题的尝试。它不像 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)}