F# 使用F在另一个列表的基础上减少列表的最快方法#

F# 使用F在另一个列表的基础上减少列表的最快方法#,f#,F#,在F#中,基于另一个列表中的项目删除一个列表中的项目的最有效方法是什么 示例: seq1=[“蓝色”、“绿色”、“红色”、“绿色”…] seq2=[“苏打水”;“绿色”;“汽水”…] seq1最初有50000个项目 seq2有12个,并且随着时间的推移,其规模继续增长 我想做的是删除seq1的所有实例,如果该值在seq2中 我有下面的代码,这是尽我所能的慢-不是我想要的 let result = seq1 |> Seq.filter(fun a -> (Seq.exists(fun

在F#中,基于另一个列表中的项目删除一个列表中的项目的最有效方法是什么

示例:
seq1=[“蓝色”、“绿色”、“红色”、“绿色”…]

seq2=[“苏打水”;“绿色”;“汽水”…]

seq1最初有50000个项目 seq2有12个,并且随着时间的推移,其规模继续增长

我想做的是删除seq1的所有实例,如果该值在seq2中

我有下面的代码,这是尽我所能的慢-不是我想要的

let result = seq1 |> Seq.filter(fun a -> (Seq.exists(fun name -> name = a) seq2) = false)
我试图找到一种快速的方法来实现这一功能(无循环等)


谢谢:-)

如果
seq1
相对较长而
seq2
相对较短,则可以从
seq2
的元素创建一个集合,然后使用集合的
Contains
方法检查它是否包含指定的元素。使用
Seq.exists
在集合中查找要比在序列中查找快得多

我正在使用一个基于您的数字的简单脚本进行测试:

#time
let seq1 = Array.init 50000 (fun i -> ["blue"; "green"; "red"].[i%3])
let seq2 = Array.init 12 (fun i -> [ "soda"; "green"; "pop"].[i%3])
现在,这里有几个选项(我将它们包装在
中,用于I in 1..10 do
以获得更合理的数字,然后将其除以10):


请注意,我没有将
set-seq2
调用推出循环-如果这样做,它会更快(您只需要在更改
seq2
时创建集合,然后就可以保留它)。

如果
seq1
相对较长而
seq2
相对较短,然后,您可以从
seq2
的元素创建一个集合,然后使用集合的
Contains
方法检查它是否包含指定的元素。使用
Seq.exists
在集合中查找要比在序列中查找快得多

我正在使用一个基于您的数字的简单脚本进行测试:

#time
let seq1 = Array.init 50000 (fun i -> ["blue"; "green"; "red"].[i%3])
let seq2 = Array.init 12 (fun i -> [ "soda"; "green"; "pop"].[i%3])
现在,这里有几个选项(我将它们包装在
中,用于I in 1..10 do
以获得更合理的数字,然后将其除以10):


请注意,我没有将
set seq2
调用推出循环-如果这样做,它会更快(您只需要在更改
seq2
时创建集合,然后您就可以保留它)。

可能重复的好答案的可能重复,但是您可以编写最后一个表达式
let result=seq1 |>Array.filter l.Contains
;p@markseemann我认为您需要
l.Contains>>而不是
,但这仍然很好,并且没有过度使用无点样式@托马斯:非常感谢你,托马斯,这是多么大的不同啊。:-)回答得很好,但您可以编写最后一个表达式
let result=seq1 |>Array.filter l.Contains
;p@markseemann我认为您需要
l.Contains>>而不是
,但这仍然很好,并且没有过度使用无点样式@托马斯:非常感谢你,托马斯,这是多么大的不同啊。:-)