从Clojure中的值列表返回一个映射

时间:2014-10-08 12:19:37

标签: clojure

如何将列表或向量中的值放入地图?

我是按照以下方式做的,但看起来并不简单:

user=> (into {} (map #(into [] %) (partition 2 [1 2 3 4 5 6])))
{1 2, 3 4, 5 6}
user=>

或者,如果我还想处理奇数个值(虽然可能不值得,但可能保留键):

user=> (into {} (map #(if (even? (count %))
  #_=>                  (into [] %)
  #_=>                  [(first %) nil])
  #_=>               (partition-all 2 [1 2 3 4 5])))
{1 2, 3 4, 5 nil}
user=>

有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

过敏性条件版本,测试矢量和列表,偶数和奇数。

(defn seq->map
  [s]
  (let [s+ (concat s [nil])]
    (zipmap (take-nth 2 s+)
            (take-nth 2 (rest s+)))))

(seq->map '(1 2 3 4))   ; {3 4, 1 2}
(seq->map '(1 2 3 4 5)) ; {5 nil, 3 4, 1 2}
(seq->map [1 2 3 4])    ; {3 4, 1 2}
(seq->map [1 2 3 4 5])  ; {5 nil, 3 4, 1 2}

答案 1 :(得分:2)

以下函数应该处理这两种情况(假设Vector作为参数传递给to-map):

(defn to-map [v]
  (apply hash-map
         (if (odd? (count v))
           (conj v nil)
           v)))