我目前对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
然后对此进行扩展,我将如何获得所有第二个元素?是否最好在没有第一个元素的情况下创建新列表(通过使用类似的函数删除它们)然后重用这个相同的函数?
答案 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.head
或List.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])