9

1 つの整数だけでなく、整数の seq に基づいて seq を分割するより慣用的な方法は何でしょうか?

これが私の実装です:

(defn partition-by-seq
  "Return a lazy sequence of lists with a variable number of items each
  determined by the n in ncoll.  Extra values in coll are dropped."
  [ncoll coll]
  (let [partition-coll (mapcat #(repeat % %) ncoll)]
    (->> coll
         (map vector partition-coll)
         (partition-by first)
         (map (partial map last)))))

次に(partition-by-seq [2 3 6] (range))、 が得られ((0 1) (2 3 4) (5 6 7 8 9 10))ます。

4

3 に答える 3

4

lazy-seqあなたの実装は問題ないように見えますが、あなたの場合のように map と既存の partition-by を使用するよりも、ラップされた単純な再帰を使用する (そしてより効率的であることが判明する)より単純なソリューションがある可能性があります。

(defn partition-by-seq [ncoll coll]
  (if (empty? ncoll)
    '()
    (let [n (first ncoll)]
      (cons (take n coll)
            (lazy-seq (partition-by-seq (rest ncoll) (drop n coll)))))))
于 2013-03-05T16:38:23.157 に答える
3

Ankur の回答のバリエーションで、怠惰が少し追加さwhen-letれ、明示的なテストの代わりにempty?.

 (defn partition-by-seq [parts coll]
    (lazy-seq
      (when-let [s (seq parts)]
        (cons
          (take (first s) coll)
          (partition-by-seq (rest s) (nthrest coll (first s)))))))
于 2013-03-05T19:34:58.167 に答える
2
(first (reduce (fn [[r l] n]
                 [(conj r (take n l)) (drop n l)])
               [[] (range)]
               [2 3 6]))

=> [(0 1) (2 3 4) (5 6 7 8 9 10)]
于 2013-03-05T16:26:33.787 に答える