gpt4 book ai didi

list - 如何使用给定的组大小对列表进行分区?

转载 作者:行者123 更新时间:2023-12-03 18:12:06 24 4
gpt4 key购买 nike

我正在寻找对列表(或 seq)进行分区的最佳方法,以便组具有给定的大小。
例如。假设我想以大小 2 分组(尽管这可以是任何其他数字):

let xs = [(a,b,c); (a,b,d); (y,z,y); (w,y,z); (n,y,z)]
let grouped = partitionBySize 2 input
// => [[(a,b,c);(a,b,d)]; [(y,z,y);(w,y,z)]; [(n,y,z)]]

实现 partitionBySize 的明显方法是将位置添加到输入列表中的每个元组,使其变为
[(0,a,b,c), (1,a,b,d), (2,y,z,y), (3,w,y,z), (4,n,y,z)]

然后将 GroupBy 与
xs |> Seq.ofList |> Seq.GroupBy (function | (i,_,_,_) -> i - (i % n))

然而,这个解决方案对我来说看起来不是很优雅。
有没有更好的方法来实现这个功能(也许是内置函数)?

最佳答案

这似乎是 F# 核心库中的任何函数都没有捕获的重复模式。之前解决类似问题的时候,我定义了一个函数Seq.groupWhen (参见 F# snippets )将序列分成组。当谓词成立时开始一个新组。

您可以使用 Seq.groupWhen 解决问题类似于 Seq.group (通过在偶数索引处开始一个新组)。与 Seq.group 不同,这是有效的,因为 Seq.groupWhen只迭代输入序列一次:

[3;3;2;4;1;2;8] 
|> Seq.mapi (fun i v -> i, v) // Add indices to the values (as first tuple element)
|> Seq.groupWhen (fun (i, v) -> i%2 = 0) // Start new group after every 2nd element
|> Seq.map (Seq.map snd) // Remove indices from the values

直接使用递归实现函数可能更容易——John 的解决方案正是你所需要的——但如果你想看到更通用的方法,那么 Seq.groupWhen可能很有趣。

关于list - 如何使用给定的组大小对列表进行分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8064016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com