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




# (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))




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