访问列表列表中的第一个元素[F#]

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)

然后扩展它,我将如何获得所有第二个元素?是否最好在没有第一个元素的情况下创建新列表(通过使用类似函数删除它们)然后重用相同的函数?

Pie*_*Pah 5

您可以使用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.headList.tail在这种情况下.

  • 除了`List.head`之外,还有`List.tryHead`,它与本答案中的`firstElements`函数完全*相同.作为F#中的一般规则,任何可能失败的函数(例如,`List.head`将在空列表中失败)将在名称中具有返回选项的`try`版本.所以`List.head`返回一个`int`但可能抛出一个异常; `List.tryHead`返回一个`int选项`,永远不会抛出异常.如果您*知道*您拥有的列表从不为空,那么`List.head`更容易使用.如果它们*可能是*为空,那么`List.tryHead`会让你处理这两种情况. (3认同)
  • 这将返回一个 `int 选项`s 列表,而不是一个 `int`s 列表。 (2认同)

s95*_*163 5

访问列表中第一个元素的最简单方法是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)