¿Hay un equivalente para la función Zip en Clojure Core o Contrib?


Answers

(map vector [1 2 3] [4 5 6])
Question

En Clojure, quiero combinar dos listas para dar una lista de pares,

> (zip '(1 2 3) '(4 5 6))  
((1 4) (2 5) (3 6))

En Haskell o Ruby, la función se llama zip . Implementarlo no es difícil, pero quería asegurarme de no perderme una función en Core o Contrib.

Hay un espacio de nombres zip en Core, pero se described como que proporciona acceso a la técnica funcional Zipper, que no parece ser lo que estoy buscando.

¿Existe una función equivalente para combinar 2 o más listas, de esta manera, en Core?

Si no lo hay, ¿es porque hay un enfoque idiomático que hace innecesaria la función?




para darle exactamente lo que quería, la list mapeo entre las dos listas le dará una lista de listas como en su ejemplo. Creo que muchos Clojurianos tenderían a usar vectores para esto, aunque funcionará con cualquier cosa. y las entradas no necesitan ser del mismo tipo. map crea seqs de ellos y luego mapea los seqs para que cualquier entrada seq'able funcione bien.

(map list '(1 2 3) '(4 5 6))
(map list  [1 2 3] '(4 5 6))
(map hash-map  '(1 2 3) '(4 5 6))
(map hash-set  '(1 2 3) '(4 5 6))



# (apply map list%) transpone una matriz como la función zip * de Python. Como una definición macro:

usuario => (defmacro py-zip [lst] `(aplicar lista de mapas ~ lst))

# 'usuario / py-zip

usuario => (py-zip '((1 2 3 4) (9 9 9 9) (5 6 7 8)))

((1 9 5) (2 9 6) (3 9 7) (4 9 8))

usuario => (py-zip '((1 9 5) (2 9 6) (3 9 7) (4 9 8)))

((1 2 3 4) (9 9 9 9) (5 6 7 8))




Links