1

我想减少以下序列:

({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"]}}

但我不知道这样做。

我正在考虑使用解构的递归函数。

4

2 回答 2

3

标准库中有一个函数可以将序列简化为某种东西,它被称为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)))}))
于 2013-09-27T19:10:54.683 回答
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))))}

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

于 2013-09-27T20:58:28.380 回答