繁体   English   中英

F#取一个列表,返回元组列表

[英]F# take a list, return list of tuples

我做了一些研究,我发现List.zip函数有两个列表并返回一个元组列表,但是如何将一个列表更改为元组列表?

let rec combinePair xs =
    match xs with
    | [] -> []
    | [x1] -> []
    | x1::x2::x3::xs -> [(x1, x2)]
    | x1::x2::xs -> [(x1, x2)] 

如果列表中存在奇数个元素,则应删除最后一个元素,如果存在偶数个元素,则应将它们作为元组列表返回。 例如

combinePair [x1; x2; x3; x4] = [(x1, x2); (x3, x4)]

你的代码几乎就在那里。

这是思考:

  • 当给出一个空列表时,结果是一个空列表(你已经得到了它)。
  • 当给出一个元素的列表时,结果是一个空列表(也得到了它)。
  • 否则,第一项结果是由前两个元素组成的元组,其余结果是将相同的过程应用于其余输入的结果。

这几乎可以完全翻译成F#:

let rec combinePair xs =
    match xs with
    | [] | [_] -> []
    | x1::x2::rest -> (x1, x2) :: (combinePair rest)

(注意我如何将前两种情况合并在一行, [] | [_] ->

我确信有更漂亮的解决方案,但对于那些对递归过敏的人:

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

List.chunkBySize 2 xsOdd 
    |> List.filter (fun x -> x.Length = 2) 
    |> List.map (fun x -> x.[0],x.[1])
//val it : (int * int) list = [(1, 2); (3, 4)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM