2014-10-08 81 views
1

如何将列表或向量中的值放入地图中?从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=> 

有没有更简单的方法来做到这一点?

+0

第一个可以用'(应用散列图[1 2 3 4 5 6])'完成。 – Tomo 2014-10-08 12:28:53

+0

非常好,谢谢@Tomo。我想用你的建议,我可以用'(应用哈希映射(let [a [1 2 3 4 5]](if(odd?(count a))(conj nil)a))来实现第二个。 )'。随意把它放在答案的格式。 – pestrella 2014-10-08 12:38:25

+0

让我们看看有没有比我更聪明的人能更好地回答它。 :) – Tomo 2014-10-08 12:45:39

回答

2

的下面功能应该采取的这两种情况下护理(假设一个矢量被作为参数传递给到图):

(defn to-map [v] 
    (apply hash-map 
     (if (odd? (count v)) 
      (conj v nil) 
      v))) 
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}