的一箇中等規模的名單,我需要一個非常快速和有效的方式來「轉」 Clojure中的地圖列表。Clojure的:「轉」有效映射
比方說,我有:
(def monthly-sales [{:month 1 :pc "A" :sales 100}
{:month 2 :pc "B" :sales 200} ... {:month 12 :pc "Z" :sales 100}])
我需要這樣的:
|PC|1|2|3|4|5|6|7|8|9|10|11|12|
|A|100||||||||||||
|Etc.|
我回答以下問題:
(let [grouped (group-by (apply juxt [:month]) monthly-sales)]
(apply str (interpose "\n"
(for [k (distinct (map :pc rows))]
(str "|" k "|" (clojure.string/join "|"
(for [n (range 1 13)]
(get (first (filter #(= (:pc %) k) (get grouped [n]))) :sale))))))))))))
基本上我通過分組的所有值月(分組注意,由於「應用juxt」,可以鍵入多於1個鍵),這是該列的關鍵。做到這一點,我推斷了pc的獨特價值,這將是該行的關鍵。休息應該是自我解釋。
你認爲這是明確的clojurian設計?它能更有效率和清晰嗎?
相關鏈接: http://pramode.net/clojure/2010/06/01/lazy-sequences-in-clojure/