3

是否有核心功能或一些惯用的方式来对集合进行“反向展平”?例如,我想要以下内容:

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

当然,上述情况下的表单需要偶数个元素,或者如果呈现奇数个集合,该函数应该做一些明智的事情。当然,广义的 by-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)))))
4

3 回答 3

7

您可以使用reducepartition

(reduce #(partition %2 %1) '(1 2 3 4 5 6 7 8) [2 2])
于 2013-03-15T09:09:20.597 回答
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))
于 2013-03-15T08:00:39.043 回答
1

我知道没有这样的标准功能。但分区很有帮助:

(defn by [sizes coll]
  (if sizes
    (by (next sizes) (partition (first sizes) coll))
    coll))
于 2013-03-15T08:02:18.400 回答