clojure sequences

¿Cómo puedo combinar dos secuencias en clojure?



sequences (5)

Creo que la solución de andih funciona muy bien. Aquí hay una forma alternativa porque oye por qué no. Utiliza concat y distinct :

user> (distinct (concat ''(1 2 3) ''(2 3 4))) => (1 2 3 4)

¿Cuál es una forma idiomática de fusionar (o recuperar la unión de) dos listas (o secuencias) en Clojure?

(merge l1 l2)

no parece ser la solución

a=> (merge ''(1 2 3) ''(2 3 4)) ((2 3 4) 1 2 3)


Si lo que desea es en realidad datos no clasificados (conjuntos) distintos, debe utilizar la estructura de datos del conjunto de Clojure en lugar de vectores o listas. Y como andih sugirió indirectamente, hay una biblioteca central para operaciones de conjuntos: http://clojure.github.com/clojure/clojure.set-api.html

(require ''[clojure.set :refer [union]]) (union #{1 2 3} #{3 4 5}) => #{1 2 3 4 5}

Si los conjuntos son por cualquier motivo, no por lo que quieres, sigue leyendo. concat cuidado con concat cuando tenga una cantidad significativa de datos en sus secuencias, y considere la posibilidad de utilizarlos into un algoritmo de fusión de vectores mucho mejor optimizado. No sé por qué concat no se implementa usando (o mejor aún, ¿por qué concat incluso existe? BTW, mientras que en es significativamente más rápido que concat, todavía es mucho más lento que los árboles RRB de Bagwell, compatible con ambos Clojure y Scala resolverán este problema, pero aún no están implementados para Clojure).

Para reformular la solución no establecida de Omri en términos de ''en'':

(distinct (into [1 2 3] [3 4 5])) => (1 2 3 4 5)


Si no te importa duplicados, puedes intentar concat :

(concat ''(1 2 3 ) ''(4 5 6 1) ''(2 3)) ;;==> (1 2 3 4 5 6 1 2 3)


Una forma de obtener la unión de dos listas es usar union

Clojure> (into #{} (clojure.set/union ''(1,2,3) ''(3,4,5))) #{1 2 3 4 5}

o si quieres obtener una lista

(into ''() (into #{} (clojure.set/union ''(1,2,3) ''(3,4,5)))) (5 4 3 2 1)


Una opción es flatten :

(def colls ''((1 2 3) (2 3 4))) (flatten colls) ;; => (1 2 3 2 3 4) (distinct (flatten colls)) ;; => (1 2 3 4)

Una cosa a tener en cuenta es que aplanará las colecciones profundamente anidadas:

(flatten [[1 2 [3 4 5]] [1 [2 [3 4]]]]) ;; => (1 2 3 4 5 1 2 3 4)

Pero funciona bien para los mapas:

(flatten [[{} {} {}] [{} {} {}]]) ;; => ({} {} {} {} {} {})