Clojure有一个很好的函数叫做分区,它可以处理序列.它将给定的序列分成一系列同样长的列表.第一个参数指定fragaments的长度.第二个参数是一个偏移量,它指定片段的下一个开始.
(partition 3 1 (range 5))
;;=> ((0 1 2) (1 2 3) (2 3 4))
(partition 4 6 (range 20))
;;=> ((0 1 2 3) (6 7 8 9) (12 13 14 15))
(partition 4 3 (range 20))
;;=> ((0 1 2 3) (3 4 5 6) (6 7 8 9) (9 10 11 12) (12 13 14 15) (15 16 17 18))
Run Code Online (Sandbox Code Playgroud)
https://clojuredocs.org/clojure.core/partition
我正在寻找F#中的等效函数.显然,List.partition还有其他功能(https://msdn.microsoft.com/en-us/library/ee353782.aspx).也许有一个图书馆提供这样的功能?
在F#中你有两个相似的函数:windowed它们类似于Clojure的分区,但第二个参数固定为1 chunkBySize,第二个参数等于第一个参数.
您可以将两者结合起来并获得所需的功能.以下是列表的示例:
let partition x y = List.windowed x >> List.chunkBySize y >> List.map List.head
Run Code Online (Sandbox Code Playgroud)
它们也可用于数组和序列,但请注意,对于序列,内部集合将是一个数组,实际上是一个序列.因此,如果您希望将结果严格推断为序列序列,则必须添加转换或向上转换:
let partition x y = Seq.windowed x >> Seq.chunkBySize y >> Seq.map (Seq.head >> seq)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |