2013-03-15 61 views
3

是否有一個核心功能或某種慣用的方法來對集合進行「反向壓平」? 例如,像下面這樣:Clojure逆向展平列表。例如。 '(1 2 3 4 5 6)到'((1 2)(3 4)(5 6)

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

當然,在上述情況下的形式將需要一個甚至多個元素或功能應該理智做事,如果帶有奇數集合的廣義通過-N功能。那當然會更好,我不清楚是否有任何優點試圖概括這個概念的深度以及什麼是最好的形式:

(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

您可以使用reducepartition

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

更好的版本! – mishadoff 2013-03-15 10:40:02

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)) 
相關問題