如何将数字列表转换为地图?

时间:2009-10-07 00:13:46

标签: clojure

我有一个键列表:(1 2 3 4)

我希望地图的值设置为0,如下所示:{1 0, 2 0, 3 0, 4 0}。我该怎么做?

5 个答案:

答案 0 :(得分:15)

您可以使用zipmap函数执行类似的操作:

(zipmap '(1 2 3 4) (repeat 0))
=> {4 0, 3 0, 2 0, 1 0}

zipmap获取键列表和值列表,并将它们转换为映射。 repeat函数创建一个0的无限序列。当zipmap到达较短列表的末尾时停止,所以只是不要传递两个无限序列:)

答案 1 :(得分:1)

您还可以使用James的zipmap创建一个函数:

Clojure=> (defn map-to-n [n] (zipmap (range 1 n) (repeat 0)))
#'user/map-to-n
Clojure=> (map-to-n 10)
{9 0, 8 0, 7 0, 6 0, 5 0, 4 0, 3 0, 2 0, 1 0}

答案 2 :(得分:1)

更一般的模式是使用(apply collection list来创建集合。 Clojure集合都具有“构造函数”或创建函数,这些函数接受可变数量的参数并返回捆绑在集合中的参数。如果你的参数已经被包装在另一个集合中,那么apply是一种方便的方法,可以将它们从集合中取出并将它们作为参数传递给创建函数。

这是一项更多的工作。这就是为什么我们有像zipmap这样的包装函数。

答案 3 :(得分:1)

哇我不知道zipmap,那很有用

我会这样做的

(apply hash-map (interleave '(1 2 3 4)  (repeat 0)))

答案 4 :(得分:0)

另一种方式,它保留了键的原始顺序(最多9个键!):

(defn list-to-map [& n] (->> (map vector n (repeat 0)) (into (hash-map))))

(list-to-map 1 2 3 4) => {1 0, 2 0, 3 0, 4 0}

(list-to-map 4 3 2 1) => {4 0, 3 0, 2 0, 1 0}