22

如何获取List最后一个元素的值?我注意到 List.hd(或 .Head)返回一个项目,而 List.tl(或 .Tail)返回一个列表。

是 rev the List 并获得 hd 的唯一方法吗?谢谢。

4

11 回答 11

31

试试这个功能。它使用递归,尽管由于它是尾递归,因此无论如何它都针对迭代进行了优化。无论如何,它很可能比反转整个列表(使用List.rev)更快。

let rec last = function
    | hd :: [] -> hd
    | hd :: tl -> last tl
    | _ -> failwith "Empty list."

然而,Pavel Minaev 的回答绝对值得考虑。尽管如此,您请求的算法在极少数情况下可能很有用,并且是完成任务的最有效方法。

于 2009-07-23T23:51:44.897 回答
27

一般来说,如果你需要这样做,你就做错了。由于 F# 列表是单链接的,因此访问最后一个元素的成本很高 - O(N),其中 N 的大小为list. 尝试重写您的算法,以便您始终访问第一个元素,而不是最后一个元素(即O(1))。如果您不能这样做,那么您list对数据结构的选择很可能一开始就不正确。

于 2009-07-23T23:48:33.937 回答
12

一种快速而肮脏的方法是使用 List.reduce。假设列表被调用ls

let lastElement ls = List.reduce (fun _ i -> i) ls

至于效率,我同意 Pavel。

于 2011-05-08T14:26:24.820 回答
5

基于米奇的回答更简洁的版本:

let lastItem = myList |> List.rev |> List.head

myList列表被发送到List.rev函数。然后处理结果List.head

于 2014-10-29T02:07:39.087 回答
3

同意,获取 的最后一个元素list或任何其他“可枚举”序列的效率并不高。也就是说,这个函数已经存在于Seq模块中,Seq.last.

于 2014-09-18T05:19:21.020 回答
1

作为新手 F# 开发人员,我看不出执行以下操作有什么害处

let mylist = [1;2;3;4;5]

let lastValue = mylist.[mylist.Length - 1]

本质上是必须的?是的,但不需要递归。

于 2014-08-29T04:46:53.350 回答
0

在 F# 中使用列表的常规方法是使用递归。列表中的第一项是头部(显然),列表的其余部分是尾部(与最后一项相反)。因此,当一个函数接收到一个列表时,它会处理头部,然后递归处理列表的其余部分(尾部)。

let reversedList = List.rev originalList
let tailItem = List.hd reversedList
于 2009-07-23T23:42:52.263 回答
0

下面的代码对我来说很好,我有一个整数数组,想从第 5 个项目开始,然后减去项目编号

Sum of [Array(xi) - Array(xi-5)] where i start at 5

使用的代码是:

series |> Array.windowed 5
       |> Array.fold (fun s x -> 
                            (x |> Array.rev |> Array.head) -  (x |> Array.head) + s) 0
       |> float
于 2018-01-13T18:52:45.327 回答
0

您可以调用 List.Head 来获取列表的第一个元素,这样以下表达式的计算结果为 true:

let lst = [1;2;3;4;5]
List.head lst = 1

但是,调用 List.Tail 将返回列表中第一个元素之后的每个元素,因此以下表达式为真:

let lst = [1;2;3;4;5]
List.tail lst = [2;3;4;5]

就像其他人提到的那样,F# 中没有一种有效的方法来获取列表的尾部,基本列表只是没有考虑到该功能。如果你真的想得到最后一个元素,你必须先反转你的列表,然后取新的头(这是前一个尾)。

let lst = [1;2;3;4;5]
(List.head (List.rev lst) ) = 5
于 2017-03-07T01:51:50.453 回答
0

这是一个非常古老的问题,但以防万一有人来这里:

使用 FSharp 5,您可以执行 x.[^index] ,其中索引将从数组/列表的末尾开始。

let a = [1;2;3;4;5;6;7;8;9]

a.[^0] is 9
a.[^1] is 8
etc
于 2021-02-19T23:01:15.837 回答
0

我想你可以写

list.[0..list.Length-1]
于 2016-10-19T07:29:19.293 回答