根据具有区间边界的离散键的比较,将一个序列归入桶中。

前几天,这道作业型题(在F#中创建一个自定义类型的列表,并创建该列表的两个序列。)可能很容易回答,因为只有两种可能的结果(想一想。List.partition). 这让我想知道如何将分组归纳为包括或不包括各自边界值的桶。

给定一个输入的 [5; 10; 15; 45; 50; 55] 和区间界线 [10; 20; 50],产生两个组别

[[5; 10]; [15]; [45; 50]; [55]] // less-than-and-equal
[[5]; [10; 15]; [45]; [50; 55]] // greater-than-and-equal

我可能是想多了。

type 'a ComparisonResult = Under of 'a | Over of 'a

let internal splitter op standardResult extraResultValue boundaries keySelector arg =
    boundaries |> List.tryFind (op (keySelector arg)) |> function
    | None -> extraResultValue
    | Some x -> standardResult x

let under boundaries =  // under and including
    boundaries |> List.rev |> splitter (>) Over (boundaries |> List.head |> Under)

let over boundaries =   // over and including
    boundaries |> splitter (<) Under (boundaries |> List.rev |> List.head |> Over)

[5; 10; 15; 45; 50; 55]
|> Seq.groupBy (under [10; 20; 50] id)
|> printfn "%A"

[5; 10; 15; 45; 50; 55]
|> Seq.groupBy (over [10; 20; 50] id)
|> printfn "%A"

解决方案:

这是我的解决方案。我想它对于很多边界的表现并不好。

let chunkByInterval predicate boundaries list =
    list
    |> List.groupBy (fun x -> boundaries |> List.countBy (fun b -> predicate x b))
    |> List.map snd

chunkByInterval (<=) [10; 20; 50] [5; 10; 15; 45; 50; 55] 
// [[5; 10]; [15]; [45; 50]; [55]]

chunkByInterval (>=) [10; 20; 50] [5; 10; 15; 45; 50; 55] 
// [[5]; [10; 15]; [45]; [50; 55]]

给TA打赏
共{{data.count}}人
人已打赏
未分类

XML使用外部DTD进行验证--XML解析器是Python (lxml),该解析器不能从HTTPS端加载外部DTD。

2022-9-8 23:17:38

未分类

检查是否从格式字符串中提供值

2022-9-8 23:17:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索