2014-04-19 35 views
1

我有一個看起來像這樣的列表:如何在clojure中將hashmaps列表轉換爲一個hasmap?

({:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10}) 

,我想將其轉換爲HashMap的:

{:2 9 :5 8 :6 10} 

名單是從MySQL數據庫中創建的,我不知道我能否從DATAS數據庫中的其他格式,這將更容易轉換爲一個hashmap,我使用了java.jdbc查詢功能。

任何人都可以幫助我嗎?

回答

7
(fn [data] (into {} (map (juxt :course :mark) data))) 

(list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10}) 

產生

{2 9, 5 8, 6 10} 

keyword函數不接受數字作爲論據,所以我不認爲你可以得到相當是你所期待的。但是數字無論如何都是關鍵字。


錯!正如其他人所表明的,Clojure接受數字字符串作爲關鍵字。我們可以適應上述使用這樣的:

(fn [data] (into {} (map (juxt (comp keyword str :course) :mark) data))) 

(list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10}) 

產生

{:2 9, :5 8, :6 10} 

但是,正如我已經說過了,我認爲這是不必要的風險。爲什麼不使用數字作爲鍵?


而且使用數字(字符串)關鍵字:

reader doc about symbols

  • 符號與非數字字符開頭...
  • 關鍵詞都喜歡符號除外:...(進一步限制)
+0

Neat solution._ – jforberg

+1

'juxt'在這裏是個好主意! (fn [data](into {}(map(juxt#(關鍵字(str(:course%))):mark)data))爲了得到所需的輸出結果,下面是解決方案以獲得確切的請求輸出: )' – leontalbot

+1

@leontalbot我做得有點不同,Leon。我仍然感到驚訝的是數字字符串關鍵字被接受。無論如何,帶關鍵字作爲函數的juxt具有很強的表現力。如果你在玩高爾夫球代碼:還是一個比我更長的角色,嘿嘿,另一個表達內在功能的方式是'#( - >%:course str keyword)'。 – Thumbnail

1

另一種變體。 (比縮略圖的可能不太有效的,如果你有大量的數據。)

(zipmap (map (comp keyword str :course) data) 
     (map :mark data)) 

其中data是在問題中指定的格式。

+0

...或者(應用zipmap(map#(map%data)[(comp keyword str:course):mark]))'' – Thumbnail

相關問題