2012-07-20 7 views
5

Sono molto nuovo a Clojure e non riesco a trovare un modo per fare qualcosa che sono sicuro è banale. Ho esaminato la funzione assoc come penso che questa potrebbe essere la risposta, ma non può farlo funzionare.clojure 101 combinazione di vettori in una mappa

quello che ho:

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

Quello che voglio fare è creare un vettore di mappe, ogni mappa si presenta come

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

mio OO cervello mi vuole scrivere un gruppo di cicli, ma so che c'è un modo migliore di essere un po 'perso nella grande API.

+1

"Il mio cervello OO vuole che scriva un sacco di loop" << I loop sono una caratteristica della programmazione imperativa, non OOP. I due sono ortogonali. – missingfaktor

risposta

10

Prova questo:

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

Si noti che ho usato ks invece di keys per la denominazione dei tasti, come keys è una procedura integrata in Clojure ed è una cattiva idea di ridefinirlo. Si noti inoltre che map restituisce una sequenza lenta; se assolutamente bisogno di un vettore, quindi fare questo:

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

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

Sì! Questo è esattamente quello che stavo cercando e stavo ballando per un po '. Grazie! – rooftop

+0

Il mio piacere! :) –

1

Un po 'po' più elegante, con clojure.core/partial:

(map (partial zipmap keys) people) 

E come suggerito Óscar, è necessario utilizzare un nome diverso per il keys.

+0

Usa 'mapv' per abbinare ciò che Óscar sta chiedendo. – sortega

Problemi correlati