2009-10-07 81 views

回答

15

你可以做这样的事情与zipmap功能:

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

zipmap采取键列表和值的列表,并将它们转换成地图。 repeat函数创建一个0的无限序列。当它到达较短列表的末尾zipmap停止,因此只要不传递两个无穷序列:)

+0

在我的原始地图功能中,我有一个关键的附加功能。 (map(fn [key](foo key)..)..是否有办法将该函数合并到zipmap中,还是应该在使用zipmap之前应用该函数? – unj2 2009-10-07 13:26:10

+0

它不应该是一个问题,因为映射返回一个序列,用你的地图函数替换'(1 2 3 4):例如,如果你想把这些数字转换成一个字符串,然后把它们作为关键字: (zipmap(map#(str%)'(1 2 3 4 ))(重复0)) => {“4”0,“3”0,“2”0,“1”0} 这就是你的意思吗 – 2009-10-07 22:35:08

1

您还可以创建一个功能与詹姆斯的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} 
1

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

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

1

哇,我不知道zipmap,那是有用的

我会做这样的

(apply hash-map (interleave '(1 2 3 4) (repeat 0))) 
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}

+0

小心:哈希映射没有所以你不应该依赖这个,你看到的顺序是巧合的,因为哈希映射的实现当你尝试使用9个条目时会发生什么 – TheQuickBrownFox 2015-09-06 10:55:28

+0

是的你是对的它保留了直到9 。item,所以它有相同的顺序,直到9个参数!你知道reas上? – amirteymuri 2015-09-06 11:24:45

+0

使用'type'函数可以在8个条目和9个条目中查看结果类型。我相信Clojure使用小数映射的“数组映射”作为性能优化。使用小型地图来传递数据位是一种常见的用例,在这种情况下,不需要使用完整永久散列映射的巧妙机制。 – TheQuickBrownFox 2015-09-07 06:51:44