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

时间:2017-02-17 04:07:34

标签: list f# 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)]

2 个答案:

答案 0 :(得分:5)

您的代码几乎那里。

以下是这个想法:

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

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

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

(请注意我如何将前两个案例合并到一行[] | [_] ->

答案 1 :(得分:2)

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

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)]