我有一个键列表:(1 2 3 4)
我希望地图的值设置为0,如下所示:{1 0, 2 0, 3 0, 4 0}
。我该怎么做?
答案 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}