首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候使用` `zipmap`‘和什么时候’地图矢量‘?

什么时候使用` `zipmap`‘和什么时候’地图矢量‘?
EN

Stack Overflow用户
提问于 2011-05-26 08:34:13
回答 4查看 15.6K关注 0票数 25

我询问zipmap结构的特性,只是发现我显然做错了。因此,我在这个过程中了解了(map vector v u)。但在此之前,我曾使用zipmap来完成(map vector ...)的工作。那是因为得到的映射足够小,可以排序吗?

和实际问题:有什么用途,以及如何/何时使用它。以及何时使用(map vector ...)**?**

我最初的问题需要原始的订单,所以映射任何东西都不是一个好主意。但是基本上--除了结果对的顺序--这两种方法是等价的,因为seq'd映射变成了一个向量序列。

代码语言:javascript
复制
(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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-26 12:14:17

使用(zipmap .)当您想要时,可以从不同的键和值序列直接构造一个hashmap。输出是一个hashmap:

代码语言:javascript
复制
(zipmap [:k1 :k2 :k3] [10 20 40])
=> {:k3 40, :k2 20, :k1 10}

使用(地图矢量.)当您试图合并多个序列时,。输出是一个惰性向量序列

代码语言:javascript
复制
(map vector [1 2 3] [4 5 6] [7 8 9])
=> ([1 4 7] [2 5 8] [3 6 9])

需要考虑的一些额外注意事项:

  • Zipmap只工作于两个输入序列(键+值),而映射向量可以工作在任意数量的输入序列上。如果输入序列不是键值对,那么这可能是一个很好的提示,表明您应该使用映射向量而不是zipmap
  • zipmap,这将比执行映射向量更有效和更简单,然后从键/值对创建hashmap (例如,(into {} (map vector [:k1 :k2 :k3] [10 20 40]))是一种非常复杂的方法来完成zipmap
  • 映射向量),因此它会带来一些额外的开销,但在实际需要懒惰的情况下(例如,处理无限sequences)
  • You可以做到的时候),它非常有用(seq (zipmap .))但是,要获得类似于(映射向量.)的键值对序列,请注意,这可能会重新排序密钥-值对序列(因为中间哈希映射是无序的)
票数 40
EN

Stack Overflow用户

发布于 2011-05-26 08:45:36

这些方法或多或少是等价的。当您使用zipmap时,您将得到一个带有键/值对的映射。当你在这个映射上迭代时,你会得到键值向量。然而,地图的顺序并没有定义。使用第一个方法中的“map”构造,您将创建一个包含两个元素的向量列表。定义了顺序。

在您的示例中,Zipmap的效率可能会降低一些。我会坚持“地图”。

编辑:哦,zipmap并不懒惰。所以在你的例子中不使用它的另一个原因是。

编辑2:当您真正需要地图时使用zipmap,例如用于基于快速随机密钥的访问。

票数 7
EN

Stack Overflow用户

发布于 2014-08-12 04:41:44

这两者可能看起来很相似,但在现实中却非常不同。

  • zipmap创建一个map
  • (map vector ...)创建一个n元组的LazySeq (大小为n的向量)

这是两种非常不同的数据结构。虽然一个由两个元组组成的懒惰序列可能看起来类似于一个地图,但它们的行为非常不同。

假设我们正在映射两个集合,coll1coll2。假设coll1有重复的元素。zipmap的输出将只包含与coll1中重复键的最后出现相对应的值。(map vector ...)的输出将包含带有所有重复键值的二元组。

一个简单的REPL示例:

代码语言:javascript
复制
=> (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向量:

代码语言:javascript
复制
=> (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

这是两个被认为非常相似的操作的大量限定符。这就是为什么在决定使用哪一种时必须特别小心。它们是非常不同的,服务于不同的目的,不应互换使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6135764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档