的一个中等规模的名单,我需要一个非常快速和有效的方式来“转” 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/