A menudo me encuentro utilizando una lista perezosa cuando quiero un vector, y viceversa. Además, a veces tengo un vector de mapas, cuando realmente quería un conjunto de mapas. ¿Hay alguna función auxiliar que me ayude a convertir estos tipos?En Clojure, ¿hay una manera fácil de convertir entre tipos de lista?
Respuesta
No forjemos et that trusty old into
le permite tomar cualquier cosa seq
capaz (list, vector, map, set, sorted-map) y un contenedor vacío que desee llenar, y lo pone into
.
(into [] '(1 2 3 4)) ==> [1 2 3 4] "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4} "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2} "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"
into
es una envoltura alrededor de conj
, que es la abstracción de base para la inserción de nuevas entradas adecuadamente en una colección basada en el tipo de la colección. El principio que hace que esto fluya tan bien es que Clojure está construido sobre abstracciones compostables, en este caso into
en la parte superior de conj
en la parte superior de la colección y seq
.
Los ejemplos anteriores seguirían siendo componer bien si el receptor estaba siendo aprobada en en tiempo de ejecución: debido a que las abstracciones subyacentes (seq
y conj
) se implementan para todas las colecciones (y muchas de las colecciones de Java también), por lo que las abstracciones más altas no necesita preocuparse por muchos casos de esquina especiales relacionados con los datos.
vec
, set
y generalmente into
son sus amigos para "convertir" fácilmente a otro tipo de colección.
¿Cómo desea transformar un vector de mapas en un mapa de mapas? Necesita una clave, ¿puede proporcionar el uso con la entrada de muestra/salida esperada?
perdón, quise decir un conjunto de mapas ... He modificado la pregunta ahora – Zubair
Para los vectores no es la función
user=> (vec '(1 2 3))
[1 2 3]
vec
Para secuencias perezosos existe la función
user=> (lazy-seq [1 2 3])
(1 2 3)
lazy-seq
Para convertir en conjuntos, existe la función set
user=> (set [{:a :b, :c :d} {:a :b} {:a :b}])
#{{:a :b} {:a :b, :c :d}}
Cuando tienes algo que no es perezoso, llamar 'lazy-seq' en lugar de' seq' solo agrega una indirecta inútil. Si realmente quieres devolver algo que no sea nada, incluso antes de que exista colectividad vacía, hay 'secuencia '. 'lazy-seq' es algo así como una construcción de bajo nivel. – cgrand
Para convertir un vector a una lista también se puede utilizar for
, así:
=> (for [i [1 2 3 4]] i)
(1 2 3 4)
Cuando no se desea manipular los datos, sólo tiene que utilizar seq
en el vector:
=> (seq [1 2 3])
(1 2 3)
No es necesario convertir un vector en una lista. Clojure tratará un vector como trataría una lista, como una secuencia, cuando se requiera una secuencia.Por ejemplo,
user=> (cons 0 [1 2 3])
(0 1 2 3)
Si tiene que asegurarse de que el vector está siendo tratado como una secuencia, envolverlo en seq
:
user=> (conj [1 2 3] 0) ; treated as a vector
[1 2 3 0]
user=> (conj (seq [1 2 3]) 0) ; treated as a sequence
(0 1 2 3)
Si usted tiene un vector de mapas, y quieres un conjunto de mapas, no importa que el vector tenga mapas. Usted acaba de convertir el vector a un conjunto como de costumbre:
user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}])
#{{:a 1, :b 2} {"four" 4, "three" 3}}
Una de las respuestas más para la conversión de una lista a un mapa (en aras de la exhaustividad) - a partir here:
(apply hash-map '(1 2 3 4))
;=>{1 2, 3 4}
- 1. ¿Hay alguna manera fácil de convertir Criteria a HQL?
- 2. En C#, ¿hay una manera "fácil" de realizar una cadena. ¿Entrar en la lista de tipos complejos?
- 3. En Scala, ¿hay alguna manera fácil de convertir una clase de caso en una tupla?
- 4. ¿Hay alguna manera fácil de convertir un int en una matriz de entradas de cada dígito?
- 5. ¿Hay una manera fácil de copiar un iterador en una lista en Java?
- 6. jQuery/JavaScript: convertir píxeles a em de una manera fácil
- 7. ¿Existe alguna manera fácil de aleatorizar una lista en VB.NET?
- 8. ¿Hay alguna manera fácil de adjuntar una fuente en Eclipse?
- 9. ¿Hay alguna manera fácil de revertir una lista de cambios completa de P4?
- 10. Una manera simple de convertir a/de tipos de variantes en C++
- 11. Comunicación entre aplicaciones C#: la manera fácil
- 12. ¿La forma más fácil de convertir una lista en una tabla HTML en python?
- 13. Girar una matriz de lista de lista en Clojure
- 14. Tipos anidados en clojure?
- 15. ¿Hay alguna manera fácil de obtener ServerName en Symfony?
- 16. ¿Cómo convertir una cadena de números clojure en enteros separados?
- 17. ¿Hay alguna manera fácil de obtener sombras en OpenGL?
- 18. Manera fácil de consumir/mostrar información RSS en MVC ASP.NET
- 19. La manera más fácil de recuperar XmlHttpRequest entre navegadores
- 20. Clojure tipos de datos algebraicos
- 21. pitón convertir una lista en una lista de tuplas
- 22. ¿Realmente no hay una manera fácil de probar scripts de títeres en una máquina remota?
- 23. ¿Forma fácil de inicializar una matriz de tipos de referencia?
- 24. ¿Hay alguna manera fácil de integrar jshint con netbeans?
- 25. Eclipse: ¿Hay una manera fácil de coordinar "JRE instalados" en un equipo?
- 26. ¿Hay alguna manera fácil de obtener programáticamente el alfabeto?
- 27. Android hay una manera fácil de realizar una copia de seguridad de su proyecto de Android?
- 28. ¿Hay alguna manera de implementar tipos algebraicos en Java?
- 29. ¿Hay alguna manera fácil de hacer que ScrollViewer sea "hinchable"?
- 30. La forma más fácil de convertir una lista en un conjunto en Java
+1 para en ... vale la pena señalar que también funciona con contenedores originales no vacíos también (es decir, cuando desea agregar a una colección) – mikera
También vale la pena señalar que porque 'into' utiliza' conj', doing ' (en '() some-seq) 'producirá una lista que es el * reverse * de some-seq, porque' conj' se refiere a las listas. – Chuck
Vale la pena señalar que 'en 'utiliza transitorios (para la mayoría de los tipos de seq) para obtener mejores características de rendimiento que la mayoría de los otros medios de conversión. –