- ???? 写在前面:上一章中,我们详细讲解了列表的合并,本章我们来详细讲解一下列表的过滤,在 F# 中,过滤列表是指从列表中提取满足某个条件的元素,形成一个新的列表。这个操作通常使用
List.filter
函数来完成。
目录
0x00 filter 函数介绍
0x01 内联谓词函数
0x02 链式操作:先过滤再映射
0x00 filter 函数介绍
List.filter 是一个高阶函数,它接受一个谓词函数和一个列表作为参数,并返回一个新的列表。
该列表包含所有满足谓词函数条件的元素,函数签名如下:
List.filter : ('T -> bool) -> 'T list -> 'T list
'T -> bool
是一个谓词函数,它接受一个类型为'T
的元素并返回一个 bool'T list
是输入列表- 返回值
'T list
是包含所有满足谓词函数条件的元素的新列表
???? 举个例子:假设我们有一个整数列表,我们想要提取所有的偶数:
let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
// 定义一个谓词函数,判断一个数是否为偶数
let isEven x = x % 2 = 0
// 使用 List.filter 过滤列表,得到所有偶数
let evenNumbers = List.filter isEven numbers
printfn "偶数: %A" evenNumbers
???? 运行结果: 偶数:[2; 4; 6; 8; 10]
再举个例子,过滤所有大于 5 的数:
let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
// 过滤出大于 5 的数
let greaterThanFive = List.filter (fun x -> x > 5) numbers
printfn "大于5的数: %A" greaterThanFive
???? 运行结果:大于5的数:[6; 7; 8; 9; 10]
过滤长大于 3 的字符串:
let words = ["F#"; "OCaml"; "Scala"; "Haskell"; "Python"]
// 过滤出长度大于 3 的字符串
let longWords = List.filter (fun s -> String.length s > 3) words
printfn "长度大于3的字符串:%A" longWords
???? 运行结果:长度大于3的字符串:["OCaml"; "Scala"; "Haskell"; "Python"]
0x01 内联谓词函数
我们可以直接在 filter 函数调用中,内联定义谓词函数,而不需要单独定义:
let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
// 使用内联谓词函数
let evenNumbers = List.filter (fun x -> x % 2 = 0) numbers
printfn "偶数: %A" evenNumbers
0x02 链式操作:先过滤再映射
在 F# 中,我们可以将多个列表操作链式组合,例如先过滤再映射。
???? 举个例子:先过滤出偶数,再将他们开二次方
let numbers = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
// 先过滤出偶数,然后将它们平方
let evenSquares =
numbers
|> List.filter (fun x -> x % 2 = 0)
|> List.map (fun x -> x * x)
printfn "偶数的平方: %A" evenSquares
???? 运行结果:偶数的平方: [4; 16; 36; 64; 100]
filter 函数会遍历整个列表,时间复杂度为 ,其中 是列表长度。
???? [ 笔者 ] 王亦优
???? [ 更新 ] 2024.6.5
❌ [ 勘误 ] /* 暂无 */
???? [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!
???? 参考资料 C++reference[EB/OL]. []. http://www.cplusplus.com/reference/. |