Итак, в общем, когда я сталкиваюсь с такой проблемой, я бы пошел вверх по течению и исправил формат ввода. Вектор, который является объединением произвольных частей, не имеет никакого смысла. Ради ответа, давайте предположим, что это невозможно.
Сначала мы определим вспомогательную функцию для создания карт результатов:
(defn make-result [i l u]
{:index i :lower l :upper u})
Тогда нам просто нужно отобразить эту функцию на три подпоследовательности:
(defn input->output [i]
(apply map make-result (partition (/ (count i) 3) i)))
Нам нужно использовать apply, так как мы генерируем последовательность подпоследовательностей, которые мы хотим использовать в качестве параметров для map (напомним, что функция arity должна соответствовать количеству последовательностей, которые вы передаете map - что удобно для нашего помощника).
Это будет работать для обоих векторов, указанных выше.
(input->output [1 2 3 :a :b :c :A :B :C])
({:index 1, :lower :a, :upper :A} {:index 2, :lower :b, :upper :B} {:index 3, :lower :c, :upper :C})
(input->output [1 2 3 4 :a :b :c :d :A :B :C :D])
({:index 1, :lower :a, :upper :A} {:index 2, :lower :b, :upper :B} {:index 3, :lower :c, :upper :C} {:index 4, :lower :d, :upper :D})
Поведение, если вектор находится в другом формате, может удивить или разочаровать - возможно, требуется некоторая проверка входных данных.