2010-08-01 4 views
4

Как вы можете закрепить две последовательности в Clojure? IOW, Что такое эквивалент Clojure Python zip(a, b)?Zipping Collections

EDIT:
Я знаю, как определить такую ​​функцию. Мне просто было интересно, предоставляет ли стандартная библиотека такую ​​функцию уже. (Я бы * очень * удивлен, если он не делает.)

+0

В ядре нет функции zip. «список карт» считается эквивалентной идиомой. –

+0

единственной функцией, которая приближается к zip, является «чередование», которое вернется (1 4 2 5 3 6). –

+0

У меня clojure нет огромной стандартной библиотеки, такой как python. Я уверен, что он будет расти, но я не думаю, что clojure должен доказывать библиотеку большого стандарта. Библиотека, которая является большой, так же плоха, как и маленькая. (Я не говорю, что эта функция не должна быть в стандартной библиотеке, это просто общая заметка.) – nickik

ответ

3

Вы можете легко определить функцию как почтовый Пайтона:

(defn zip 
    [& colls] 
    (apply map vector colls)) 

В случае (zip a b), это становится (map vector a b)

+0

Ничего себе, карта умна. – Zaz

0

если вы хотите вход быть списки вы можете определить функцию почтового индекса, как этот

(defn zip [m] (apply map list m)) 

и назвать его, как этот

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

этот вызов производит ((1 4) (2 5) (3 6))

0

Является ли это достаточно близко?

(seq (zipmap [1 2 3] [4 5 6])) 
;=> ([3 6] [2 5] [1 4]) 
+0

Не совсем: '(seq (zipmap [1 2 1] [3 4 5]))' => '([2 4] [1 5])'. – kotarak