从矢量建立一个地图

时间:2013-12-17 13:46:24

标签: clojure functional-programming

所以我有一个看起来像这样的矢量

["John" 23 "5551234" "Sally" 34 "5556667"]

向量包含更多这样的条目,我想要做的是制作这样的地图矢量:

[{:name "John" :age 23 :ph "5551234"} {:name "Sally" :age 34 :ph "5556667"}]

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:10)

(def sample ["John" 23 "5551234" "Sally" 34 "5556667" "Harry" 42 "5554242"])

使用例如输入向量将输入向量分区为记录。 (partition 3 sample)(每条记录有3个元素)然后

映射zipmap:

(mapv #(zipmap [:name :age :ph] %) (partition 3 sample))
; => [{:ph "5551234", :age 23, :name "John"} 
;     {:ph "5556667", :age 34, :name "Sally"}
;     {:ph "5554242", :age 42, :name "Harry"}]

或者使用for理解(返回一个懒惰的序列而不是一个向量):

(for [[name age ph] (partition 3 sample)] {:name name :age age :ph ph})
; => ({:name "John", :age 23, :ph "5551234"} 
      {:name "Sally", :age 34, :ph "5556667"} 
      {:name "Harry", :age 42, :ph "5554242"})

注意没有为地图定义键顺序。 for的理解是使用数组映射,因为键值对的数量很小,因此键按顺序出现,但这是一个实现细节。如果顺序很重要,您可以显式使用数组映射,但是对于较大地图上的查找会有性能损失。

答案 1 :(得分:0)

另外几个选项:

(->> ["John" 23 "5551234" "Sally" 34 "5556667"]
     (partition 3)
     (map (fn [[name age ph]]
            {:name name :age age :ph ph})))

(->> ["John" 23 "5551234" "Sally" 34 "5556667"]
     (partition 3)
     (map (partial interleave [:name :age :ph]))
     (map (partial apply hash-map)))