我询问zipmap结构的特性,只是发现我显然做错了。因此,我在这个过程中了解了(map vector v u)。但在此之前,我曾使用zipmap来完成(map vector ...)的工作。那是因为得到的映射足够小,可以排序吗?
和实际问题:有什么用途,以及如何/何时使用它。以及何时使用(map vector ...)**?**
我最初的问题需要原始的订单,所以映射任何东西都不是一个好主意。但是基本上--除了结果对的顺序--这两种方法是等价的,因为seq'd映射变成了一个向量序列。
(for [pair (map vector v (rest v))]
( ... )) ;do with (first pair) and (last pair)
(for [pair (zipmap v (rest v))]
( ... )) ;do with (first pair) and (last pair)发布于 2011-05-26 12:14:17
使用(zipmap .)当您想要时,可以从不同的键和值序列直接构造一个hashmap。输出是一个hashmap:
(zipmap [:k1 :k2 :k3] [10 20 40])
=> {:k3 40, :k2 20, :k1 10}使用(地图矢量.)当您试图合并多个序列时,。输出是一个惰性向量序列。
(map vector [1 2 3] [4 5 6] [7 8 9])
=> ([1 4 7] [2 5 8] [3 6 9])需要考虑的一些额外注意事项:
(into {} (map vector [:k1 :k2 :k3] [10 20 40]))是一种非常复杂的方法来完成zipmap发布于 2011-05-26 08:45:36
这些方法或多或少是等价的。当您使用zipmap时,您将得到一个带有键/值对的映射。当你在这个映射上迭代时,你会得到键值向量。然而,地图的顺序并没有定义。使用第一个方法中的“map”构造,您将创建一个包含两个元素的向量列表。定义了顺序。
在您的示例中,Zipmap的效率可能会降低一些。我会坚持“地图”。
编辑:哦,zipmap并不懒惰。所以在你的例子中不使用它的另一个原因是。
编辑2:当您真正需要地图时使用zipmap,例如用于基于快速随机密钥的访问。
发布于 2014-08-12 04:41:44
这两者可能看起来很相似,但在现实中却非常不同。
zipmap创建一个map(map vector ...)创建一个n元组的LazySeq (大小为n的向量)。
这是两种非常不同的数据结构。虽然一个由两个元组组成的懒惰序列可能看起来类似于一个地图,但它们的行为非常不同。
假设我们正在映射两个集合,coll1和coll2。假设coll1有重复的元素。zipmap的输出将只包含与coll1中重复键的最后出现相对应的值。(map vector ...)的输出将包含带有所有重复键值的二元组。
一个简单的REPL示例:
=> (zipmap [:k1 :k2 :k3 :k1] [1 2 3 4])
{:k3 3, :k2 2, :k1 4}
=>(map vector [:k1 :k2 :k3 :k1] [1 2 3 4])
([:k1 1] [:k2 2] [:k3 3] [:k1 4])考虑到这一点,在假设以下情况时看到危险是微不足道的:
,但基本上--除了结果对的顺序--这两种方法是等价的,因为seq d映射成为一个向量序列。
seq'd映射成为一个向量序列,但不一定与(map vector ...)的结果相同
为了完整起见,以下是排序的seq'd向量:
=> (sort (seq (zipmap [:k1 :k2 :k3 :k1] [1 2 3 4])))
([:k1 4] [:k2 2] [:k3 3])
=> (sort (seq (map vector [:k1 :k2 :k3 :k1] [1 2 3 4])))
([:k1 1] [:k1 4] [:k2 2] [:k3 3])我认为,我们最接近于上述陈述的是:
如果set本身就是set,则(zip map coll1 coll2)结果的set将等于(map vector coll1 coll2)结果的set。
这是两个被认为非常相似的操作的大量限定符。这就是为什么在决定使用哪一种时必须特别小心。它们是非常不同的,服务于不同的目的,不应互换使用。
https://stackoverflow.com/questions/6135764
复制相似问题