将列表映射转换为映射列表(即行到列)

时间:2013-01-29 12:48:57

标签: list clojure maps transformation

我在Clojure中有以下数据结构

{:a [1 2 3]
 :b [4 5 6]
 :c [7 8 9]} 

我想把它转换成类似

的东西
[{:a 1 :b 4 :c 7}
 {:a 2 :b 5 :c 8}
 {:a 3 :b 6 :c 9}]

目前我有点难过如何做到这一点。

2 个答案:

答案 0 :(得分:3)

在Clojure中,您无法保证转换后地图中键的顺序。它们是按键索引的,而不是按顺序索引的。

然而,

载体。使用get-in,您可以使用坐标向量查找位置。

=> (def mat
     [[1 2 3]
      [4 5 6]
      [7 8 9]])

=> (defn transpose
     [m]
     (apply mapv vector m))

=> (get-in (transpose mat) [1 2])
8

答案 1 :(得分:2)

知道了:

(defn transpose-lists [x] 
  (map (fn [m] (zipmap (keys x) m)) (apply map vector (vals x))))

不幸的是,它不保留键的顺序。 如果有人有更好的解决方案,那么我当然希望听到它!