如何从 F# 列表中取出最后 N 项?

Tri*_*Gao 5 f#

我会做类似的事情

let last n xs = xs |> List.rev |> Seq.take n |> List.ofSeq |> List.rev
Run Code Online (Sandbox Code Playgroud)

我不确定是否要将列表转换为序列并返回。F# 你就是这样做的吗?

Cha*_*nga 5

顺序+跳过

获取最后 N 个项目相当于跳过前 (length - N) 个项目,因此对于作为输入(和输出)的序列,您可以执行以下操作:

let last n xs = Seq.skip ((Seq.length xs) - n) xs
Run Code Online (Sandbox Code Playgroud)

(或者,通过管道,let last n xs = xs |> Seq.skip (Seq.length xs - n)

对于作为输入(和输出)的列表,您可以执行以下操作:

let last n xs = List.toSeq xs |> Seq.skip (xs.Length - n) |> Seq.toList
Run Code Online (Sandbox Code Playgroud)

或者通过定义两者,只需将其传递到序列一:

let lastList n xs = List.toSeq xs |> last n |> Seq.toList
Run Code Online (Sandbox Code Playgroud)

尾部+递归

或者,这可以通过(尾部)递归应用 Tail 来实现,如下所示:

let rec last n xs =
  if List.length xs <= n then xs
  else last n xs.Tail
Run Code Online (Sandbox Code Playgroud)