Cod*_*Guy 4 recursion f# sublist
我现在对F#感兴趣,因为它与我以前用过的所有东西都不一样.我需要访问大型列表中包含的每个列表的第一个元素.如果我假设主列表包含"x"列表本身包含5个元素,那么访问每个第一个元素的最简单方法是什么.
let listOfLists = [[1; 2; 3; 4; 5]; [6; 7; 8; 9; 10]; [11; 12; 13; 14; 15]]
我想要的输出将是一个包含[1; 6; 11]的新列表
目前我有
let rec firstElements list =
match list with
| list[head::tail] ->
match head with
| [head::tail] -> 1st @ head then firstElements tail
Run Code Online (Sandbox Code Playgroud)
然后扩展它,我将如何获得所有第二个元素?是否最好在没有第一个元素的情况下创建新列表(通过使用类似函数删除它们)然后重用相同的函数?
您可以使用map来提取每个子列表的head元素:
let firstElements li =
match li with [] -> None | h::_ -> Some h
let myfirstElements = List.map firstElements listOfLists
Run Code Online (Sandbox Code Playgroud)
我正在使用Ocaml的说法,对F#进行一些查找,所以这可能不准确,但这个想法适用.
编辑:你也可以使用List.head
它使它更简洁,并将返回int list
而不是int option list
.但是,如果您点击一个空列表,它会抛出异常.大多数时候,我会避免使用List.head
或List.tail
在这种情况下.
访问列表中第一个元素的最简单方法是List.head
。当你有一个列表列表时,你只需要List.map
这个函数:
let listOfLists = [ [1;2;3;4;5]; [6;7;8;9;10]; [11;12;13;14;15] ]
listOfLists
|> List.map List.head
//val it : int list = [1; 6; 11]
Run Code Online (Sandbox Code Playgroud)
现在,如果您需要访问其他元素,您可以使用List.item
或仅使用 索引到列表中xs.[1]
。但请记住,对于大型列表,这将效率低下,如果您想快速查找,请使用数组。
listOfLists
|> List.map (List.item 1)
//val it : int list = [2; 7; 12]
Run Code Online (Sandbox Code Playgroud)
带索引:
listOfLists
|> List.map (fun x -> x.[1])
Run Code Online (Sandbox Code Playgroud)