2013-03-15 4 views
3

Есть ли основная функция или какой-либо идиоматический способ сделать «обратное сглаживание» коллекции? Например, я бы как следующее:Clojure переформатированные списки. Например. '(1 2 3 4 5 6) to' ((1 2) (3 4) (5 6)

(by-two '(1 2 3 4 5 6)) ; evals to '((1 2) (3 4) (5 6)) 

конечно форме, в описанном выше случае потребуется четное число элементов или функция должна сделать что-то разумное, если представлены с нечетным номером коллекцией Обобщенного по-п функции. было бы лучше, конечно. Мне непонятно, есть ли какая-то заслуга в попытке обобщить понятие в глубину, а также, что наилучшая форма для этого:

(by [2 2] '(1 2 3 4 5 6 7 8)) ; evals to '(((1 2) (3 4)) ((5 6) (7 8))) 
(by [3 2 1 1 1] '(1 2 3 4 5 6)) ; evals to '(((((1 2 3) (4 5 6))))) 

ответ

7

Вы можете использовать reduce и partition:

(reduce #(partition %2 %1) '(1 2 3 4 5 6 7 8) [2 2]) 
+0

Лучше версия! – mishadoff

2

Там в partition:

(partition 2 [1 2 3 4 5]) 
> ((1 2) (3 4)) 

Если вы хотите включить небольшой хвост, есть partition-all:

(partition-all 2 [1 2 3 4 5]) 
> ((1 2) (3 4) (5)) 
1

Там нет такой стандартной функции я в курсе. Но partition полезно:

(defn by [sizes coll] 
    (if sizes 
    (by (next sizes) (partition (first sizes) coll)) 
    coll)) 
Смежные вопросы