2012-07-20 66 views
5

我對Clojure很陌生,似乎無法找到一種方法來做一些我確信無足輕重的事情。我看過assoc函數,因爲我認爲這可能是答案,但不能使其工作。clojure 101將矢量合併到一張地圖中

我有什麼:

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中迷失了方向。

+1

「我的OO大腦想讓我寫一堆循環」「循環是命令式編程的一個特性,而不是OOP。這兩個是正交的。 – missingfaktor 2012-07-22 07:13:24

回答

10

試試這個:我用ks,而不是keys命名的鑰匙,爲keys

(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中內置的程序,這是一個壞主意,重新定義它。另請注意,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

是的!這正是我一直在尋找的東西,並在一段時間內圍繞着邊緣舞蹈。謝謝! – rooftop 2012-07-20 16:01:36

+0

我的榮幸! :) – 2012-07-20 16:02:33

1

一個稍微有點更加優雅,使用clojure.core/partial

(map (partial zipmap keys) people) 

而奧斯卡的建議,你應該爲你的keys使用不同的名稱。

+0

使用'mapv'來匹配Óscar要求的。 – sortega 2012-07-24 15:27:56