clojure:基于一系列值对一个序列进行分区

clojure:基于一系列值对一个序列进行分区,clojure,split,clojurescript,partition,partition-by,Clojure,Split,Clojurescript,Partition,Partition By,我想根据一系列的值来划分一个seq (partition-by-seq [3 5] [1 2 3 4 5 6]) ((1 2 3)(4 5)(6)) 第一个输入是一系列分割点。 第二个输入是我想要分区的seq。 因此,第一个列表将按值3(1 2 3)进行分区,第二个分区将为(4 5),其中5是下一个拆分点 另一个例子: (partition-by-seq [3] [2 3 4 5]) result: ((2 3)(4 5)) (partition-by-seq [2 5] [2 3 5 6

我想根据一系列的值来划分一个seq

(partition-by-seq [3 5] [1 2 3 4 5 6]) 
((1 2 3)(4 5)(6))
第一个输入是一系列分割点。 第二个输入是我想要分区的seq。 因此,第一个列表将按值3(1 2 3)进行分区,第二个分区将为(4 5),其中5是下一个拆分点

另一个例子:

(partition-by-seq [3] [2 3 4 5])
result: ((2 3)(4 5))

(partition-by-seq [2 5] [2 3 5 6])
result: ((2)(3 5)(6))

给定:第一个序列(分割点)总是第二个输入序列的子集。

这就是我提出的解决方案

(def a [1 2 3 4 5 6])
(def p [2 4 5])

(defn partition-by-seq [s input]
  (loop [i 0 
         t input
         v (transient [])]
    (if (< i (count s))
        (let [x (split-with #(<= % (nth s i)) t)]
          (recur (inc i) (first (rest x)) (conj! v (first x))))
      (do
        (conj! v t)
        (filter #(not= (count %) 0) (persistent! v))))))

(partition-by-seq p a)
(定义a[1 2 3 4 5 6])
(def p[2 4 5])
(按顺序[s输入]定义分区)
(循环[i 0
t输入
v(瞬态[])]
(如果((让[x(用#分割)(要分割的序列是一个
分割线
,分割点的元素(aka.
分割线
)标记分割的最后一个元素

从你的例子来看:

(partition-by-seq [3] [2 3 4 5])
result: ((2 3)(4 5))

(partition-by-seq [2 5] [2 3 5 6])
result: ((2)(3 5)(6))
拆分对象:
[1 2 3 4 5 6]

拆分器:
[35]

结果:
((123)(45)(6))

因为生成的分区始终是递增整数序列,
x
的递增整数序列可以定义为
start(concat[(第一个拆分)]
(mapcat(juxt公司)拆分器)
[(包括(最后一次拆分))])
(第2分区)
(地图(fn[[x y]]

(subseq(apply sorted set splittee)我提出了这个解决方案,它是懒惰的,而且非常(IMO)简单

(defn part-seq [splitters coll]
  (lazy-seq
   (when-let [s (seq coll)]
     (if-let [split-point (first splitters)]
       ; build seq until first splitter
       (let [run (cons (first s) (take-while #(<= % split-point) (next s)))]
         ; build the lazy seq of partitions recursively
         (cons run
               (part-seq (rest splitters) (drop (count run) s))))
       ; just return one partition if there is no splitter 
       (list coll)))))
如果某些拆分点不在序列中

(part-seq [3 5 8] [0 1 2 4 5 6 8 9])
;;=> ((0 1 2) (4 5) (6 8) (9))
拆分器的无限序列和要拆分的序列的示例

(take 5 (part-seq (iterate (partial + 3) 5) (range)))
;;=> ((0 1 2 3 4 5) (6 7 8) (9 10 11) (12 13 14) (15 16 17))

你所说的“分割点”是什么意思?序列应该代表一个范围吗?分割点是对输入序列进行分割的值。(按序列[3][1 2 3 4 5 6]进行分割)将导致((1 2 3)(4 5 6))你尝试了什么?或者你希望我们为你做功课吗?我尝试了这个:(filter#(<1(count%))(按分割)(部分包含?第一个记号)(排序自由记号)),很接近,但我缺少结果序列中的分割点。元素可以重复吗?如果可以,是贪婪还是不贪婪?哇,非常感谢你。我可以从你的示例中学到很多。
(part-seq [3 5 8] [0 1 2 3 4 5 6 7 8 9])
;;=> ((0 1 2 3) (4 5) (6 7 8) (9))
(part-seq [3 5 8] [0 1 2 4 5 6 8 9])
;;=> ((0 1 2) (4 5) (6 8) (9))
(take 5 (part-seq (iterate (partial + 3) 5) (range)))
;;=> ((0 1 2 3 4 5) (6 7 8) (9 10 11) (12 13 14) (15 16 17))