clojure将一系列地图缩减为矢量地图

时间:2013-09-27 17:38:19

标签: recursion clojure hashmap

我想减少以下seq:

({0 "Billie Verpooten"}
 {1 "10:00"}
 {2 "17:00"}
 {11 "11:10"}
 {12 "19:20"})

{:name "Billie Verpooten"
 :work {:1  ["10:00" "17:00"]
        :11 ["11:10" "19:20"]}}

但我不知道这样做。

我想到了一个使用解构的递归函数。

2 个答案:

答案 0 :(得分:2)

有一个函数可以将序列减少到标准库中的某个部分,它被称为reduce。虽然在您的具体情况下,remove首先将0特殊情况密钥partition(defn build-map [maps] (let [entries (map first maps) key-zero? (comp zero? key)] {:name (val (first (filter key-zero? entries))) :work (reduce (fn [acc [[k1 v1] [k2 v2]]] (assoc acc (keyword (str k1)) [v1 v2])) {} (partition 2 (remove key-zero? entries)))})) 其他条目放在他们想要的条目对中似乎是合适的。

以下函数给出了问题中描述的结果:

{{1}}

答案 1 :(得分:0)

这里的变化是通过线程化序列操作函数来表达答案的另一种方式:

user> (def data '({0 "Billie Verpooten"}
                  {1 "10:00"}
                  {2 "17:00"}
                  {11 "11:10"}
                  {12 "19:20"}))

user> {:name (-> data first first val) 
       :work (as-> data x 
                   (rest x) 
                   (into {} x) 
                   (zipmap (map first (partition 1 2 (keys x))) 
                           (partition 2 (vals x))))}

as->线程宏是Clojure 1.5的新功能,使得表达这种功能更加简洁。