gpt4 book ai didi

f# - 尝试过滤掉一个序列中不属于另一个序列的值

转载 作者:行者123 更新时间:2023-12-02 09:12:10 26 4
gpt4 key购买 nike

我试图从一个序列中过滤掉不在另一个序列中的值。我很确定我的代码可以工作,但在我的计算机上运行需要很长时间,因此我不确定,所以我来这里是为了看看社区的想法。

代码如下:

let statezip =
StateCsv.GetSample().Rows
|> Seq.map (fun row -> row.State)
|> Seq.distinct

type State = State of string

let unwrapstate (State s) = s
let neededstates (row:StateCsv) = Seq.contains (unwrapstate row.State) statezip

我正在通过needstates函数进行过滤。我这样做的方式有问题吗?

let datafilter =
StateCsv1.GetSample().Rows
|> Seq.map (fun row -> row.State,row.Income,row.Family)
|> Seq.filter neededstates
|> List.ofSeq

我相信它应该按正确的值过滤序列,因为 needstates 函数是一个 bool 值。 StateCsv 和 StateCsv1 具有相同的精确结构,尽管来自不同的年份。

最佳答案

对序列和列表上的 contains 进行评估可能会很慢。对于要检查集合中元素是否存在的情况,F# Set 类型是理想的选择。您可以使用 Set.ofSeq 将序列转换为集合,然后在集合上运行逻辑。以下示例使用 1 到 10000 之间的数字,然后使用序列和集合通过检查值是否不在偶数集合中来将结果过滤为仅奇数。

使用序列:

let numberSeq = {0..10000}
let evenNumberSeq = seq { for n in numberSeq do if (n % 2 = 0) then yield n }

#time
numberSeq |> Seq.filter (fun n -> evenNumberSeq |> Seq.contains n |> not) |> Seq.toList
#time

这对我来说大约需要 1.9 秒。

使用集合:

let numberSet = numberSeq |> Set.ofSeq
let evenNumberSet = evenNumberSeq |> Set.ofSeq

#time
numberSet |> Set.filter (fun n -> evenNumberSet |> Set.contains n |> not)
#time

运行时间仅为 0.005 秒。希望您可以在执行 contains 操作之前将序列具体化为集合,从而获得这种级别的加速。

关于f# - 尝试过滤掉一个序列中不属于另一个序列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50915971/

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