5

我对 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 中。

4

2 回答 2

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})

请注意,我使用了 Clojure 中的内置过程,ks而不是keys用于命名键,重新定义它是一个坏主意。keys还要注意map返回一个惰性序列;如果您绝对需要向量,请执行以下操作:

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

=> [{:num 1, :name "tim", :age 31}
    {:num 2, :name "bob", :age 33}
    {:num 3, :name "joe", :age 44}]
于 2012-07-20T15:31:07.023 回答
1

更优雅一点,使用clojure.core/partial

(map (partial zipmap keys) people)

正如 Óscar 建议的那样,您应该为您的keys.

于 2012-07-22T07:12:51.433 回答