所以我有一个看起来像这样的矢量
["John" 23 "5551234" "Sally" 34 "5556667"]
向量包含更多这样的条目,我想要做的是制作这样的地图矢量:
[{:name "John" :age 23 :ph "5551234"} {:name "Sally" :age 34 :ph "5556667"}]
有没有办法实现这个目标?
答案 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)))