que tienen una lista de claves: (1 2 3 4)
¿Cómo se convierte una lista de números en un mapa?
Quiero un mapa con los valores establecidos a 0 como esto: {1 0, 2 0, 3 0, 4 0}
. ¿Cómo puedo hacer eso?
que tienen una lista de claves: (1 2 3 4)
¿Cómo se convierte una lista de números en un mapa?
Quiero un mapa con los valores establecidos a 0 como esto: {1 0, 2 0, 3 0, 4 0}
. ¿Cómo puedo hacer eso?
se podría hacer algo como esto con la función zipmap:
(zipmap '(1 2 3 4) (repeat 0))
=> {4 0, 3 0, 2 0, 1 0}
zipmap toma una lista de claves y una lista de los valores y las convierte en un mapa. La función repeat
crea una secuencia infinita de 0. zipmap
se detiene al llegar al final de la lista más corta, por lo que simplemente no pasar dos secuencias infinitas :)
También puede crear una función con zipmap de Santiago:
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}
El patrón más general para esto es usar (apply collection list
para crear la colección. Todas las colecciones de Clojure tienen "constructores" o funciones de creación que toman una cantidad variable de argumentos y devuelven los argumentos de los participantes agrupados en la colección. Si sus argumentos ya están envueltos en otra colección, entonces aplicar es una forma conveniente de sacarlos de la colección y pasarlos a la función de creación como argumentos.
Esto es mucho más trabajo. por eso tenemos funciones de contenedor como zipmap.
Wow yo no sabía nada de zipmap, eso es útil
yo hubiera hecho así
(apply hash-map (interleave '(1 2 3 4) (repeat 0)))
Sólo otra manera, que conserva el orden original de las teclas (hasta 9 teclas !):
(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}
Cuidado: los mapas hash no tienen una orden definido por lo que nunca debe confiar en eso. El orden que está viendo es una coincidencia debido a la implementación de los mapas hash. Vea lo que sucede cuando lo prueba con 9 elementos. – TheQuickBrownFox
Sí, tiene razón. Conserva el pedido hasta el 9 .el artículo, por lo que tiene el mismo orden hasta un máximo de 9 argumentos! ¿Sabes el ¿en? – amirteymuri
Utilice la función 'type' para ver el tipo resultante en 8 entradas y 9. Creo que Clojure usa un" mapa de matriz "para mapas más pequeños como una optimización del rendimiento. El uso de mapas pequeños para pasar bits de datos es un caso de uso común donde no hay necesidad de utilizar la maquinaria inteligente del mapa hash completo persistente. – TheQuickBrownFox
En mi función de mapa original, tenía una función adicional en la tecla. (map (fn [key] (foo key) ..) ... ¿hay alguna manera de incorporar esa función en el zipmap o debería simplemente aplicar la función antes de usar zipmap? – unj2
No debería ser un problema ya que el mapa retorna una secuencia. Simplemente reemplace '(1 2 3 4) con su función de mapa: por ejemplo, si desea convertir los números a una cadena antes de convertirlos en la clave: (zipmap (map # (str%)' (1 2 3 4)) (repetir 0)) => {"4" 0, "3" 0, "2" 0, "1" 0} ¿Es eso lo que quieres decir? –