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

あなたは使用することができreduceますpartition

(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 に答える