2009-10-07 15 views

Respuesta

15

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 :)

+0

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

+0

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? –

1

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} 
1

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.

1

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))) 
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}

+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

+0

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

+0

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

Cuestiones relacionadas