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

时间:2018-03-20 00:08:19

标签: 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

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

2 个答案:

答案 0 :(得分:5)

您可以使用map来提取每个子列表的head元素:

let firstElements li =
  match li with [] -> None | h::_ -> Some h

let myfirstElements = List.map firstElements listOfLists

我在使用Ocaml时很少查找F#,所以这可能不准确,但这个想法适用。

编辑:您还可以使用List.head,这会使其更简洁,并返回int list而不是int option list。但是,如果您点击一个空列表,它会抛出异常。大多数情况下,在这种情况下我不会使用List.headList.tail

答案 1 :(得分:1)

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

现在,如果您需要访问其他元素,可以使用List.item或只使用xs.[1]将列表编入索引。但请记住,对于大型列表,这将是低效的,如果您想快速查找使用数组。

listOfLists
|> List.map (List.item 1)
//val it : int list = [2; 7; 12]

使用索引:

listOfLists
|> List.map (fun x -> x.[1])