clojure 101将矢量组合成地图

时间:2012-07-20 15:08:38

标签: map vector clojure functional-programming lisp

我对Clojure很新,似乎无法找到一种方法来做一些我确定无关紧要的事情。我已经查看了assoc函数,因为我认为这可能是答案,但无法使其正常工作。

我有什么:

keys => [:num, :name, :age]
people =>  [ [1, "tim", 31] [2, "bob" 33] [3, "joe", 44] ]

我想要做的是创建一个地图矢量,每个地图看起来像

[ { :num 1, :name "tim", :age 31 } 
  { :num 2, :name "bob", :age 33 } 
  { :num 3, :name "joe", :age 44 } ]

我的OO大脑要我写一堆循环,但我知道有一种更好的方法我只是在大API中丢失了一些。

2 个答案:

答案 0 :(得分:10)

试试这个:

(def ks [:num :name :age])
(def people [[1 "tim" 31] [2 "bob" 33] [3 "joe" 44]])

(map #(zipmap ks %) people)

=> ({:num 1, :name "tim", :age 31}
    {:num 2, :name "bob", :age 33}
    {:num 3, :name "joe", :age 44})

请注意,我使用ks代替keys来命名密钥,因为keys是Clojure中的内置过程,重新定义它是个坏主意。还要注意map返回一个惰性序列;如果你绝对需要一个矢量,那么这样做:

(vec (map #(zipmap ks %) people))

=> [{:num 1, :name "tim", :age 31}
    {:num 2, :name "bob", :age 33}
    {:num 3, :name "joe", :age 44}]

答案 1 :(得分:1)

使用clojure.core/partial

更优雅一点
(map (partial zipmap keys) people)

正如Óscar建议的那样,您应该为keys使用不同的名称。