Обработка пар значений из двух последовательностей в Clojure

Я пытаюсь попасть в сообщество Clojure. Я много работал с Python, и одна из функций, которую я широко использую, — это метод zip() для перебора пар значений. Есть ли (умный и короткий) способ добиться того же в Clojure?


person Thomas    schedule 17.06.2009    source источник


Ответы (3)


Другой способ — просто использовать карту вместе с некоторой функцией, которая собирает свои аргументы в последовательности, например:

user=> (map vector '(1 2 3) "abc")
([1 \a] [2 \b] [3 \c])
person CAdaker    schedule 17.06.2009

(zipmap [:a :b :c] (range 3))
-> {:c 2, :b 1, :a 0}

Итерация по картам происходит попарно, например. так:

(doseq [[k v] (zipmap [:a :b :c] (range 3))]
  (printf "key: %s, value: %s\n" k v))

печатает:

key: :c, value: 2
key: :b, value: 1
key: :a, value: 0
person achim    schedule 17.06.2009
comment
Я протестировал этот подход, и он не смог обработать три или более последовательностей. Я должен был упомянуть это требование в начальном вопросе, извините. - person Thomas; 17.06.2009

На вопрос дан ответ, но есть еще interleave, который также обрабатывает произвольное количество последовательностей, но не группирует результирующую последовательность в кортежи (но для этого можно использовать partition).

person pmf    schedule 19.06.2009