Los dos pueden parecer similares, pero en realidad son muy diferentes.
zipmap
crea un mapa
(map vector ...)
crea un LazySeq
de n-tuplas (vectores de tamaño n)
Estos son dos estructuras de datos muy diferentes. Si bien una secuencia diferida de 2 tuplas puede parecer similar a un mapa, se comportan de manera muy diferente.
Digamos que estamos mapeando dos colecciones, coll1
y coll2
. Considere el caso coll1
tiene elementos duplicados. La salida de zipmap
solo contendrá el valor correspondiente a la última aparición de las claves duplicadas en coll1
. La salida de (map vector ...)
contendrá 2 tuplas con todos los valores de las claves duplicadas.
Un ejemplo sencillo 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])
Con esto en mente, es trivial para ver el peligro en asumir lo siguiente:
Pero básicamente - aparte de la orden de la resultante pares: estos dos métodos son equivalentes, porque el mapa seq'd se convierte en una secuencia de vectores.
El mapa seq'd se convierte en una secuencia de vectores, pero no necesariamente la misma secuencia de vectores como los resultados de (map vector ...)
Para completar, aquí están los vectores seq'd ordenados:
=> (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])
creo que lo más cerca que podemos llegar a una afirmación como la anterior es:
el set
del resultado de (zip map coll1 coll2)
será igual a el set
del resultado de (map vector coll1 coll2)
si coll1
es en sí set
.
Eso es una gran cantidad de calificadores para dos operaciones que son supuestamente muy similares. Es por eso que se debe tener especial cuidado al decidir cuál usar. Son muy diferentes, sirven para diferentes propósitos y no deben usarse indistintamente.
Otro uso de 'zipmap' que uso todo el tiempo es crear un mapa a partir de un vector de mapas. Considere' (datos zipmap (mapa: datos de identificación)) donde los datos son un vector de mapas, cada uno de los cuales contiene un par clave/valor ': id' único. –