我想减少以下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"]}}
但我不知道这样做。
我想到了一个使用解构的递归函数。
答案 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的新功能,使得表达这种功能更加简洁。