F#将数组转换为元组数组

时间:2017-04-26 20:30:01

标签: f#

我们说我有一个数组

let arr = [|1;2;3;4;5;6|]

我想将其转换为类似

的内容
[|(1,2);(3,4);(5,6)|]

我已经看过Seq.window,但是这个会产生类似

的东西
[|(1,2);(2,3);(3,4);(4,5);(5,6)|]

这不是我想要的

4 个答案:

答案 0 :(得分:3)

您可以使用Array.chunkBySize然后将每个子数组映射到元组:

let input = [|1..10|]
Array.chunkBySize 2 list |> Array.map (fun xs -> (xs.[0], xs.[1]))

答案 1 :(得分:1)

@ Slugart接受的答案是最好的方法(IMO)假设您知道数组具有偶数个元素,但这里有另一种方法,如果那里没有抛出异常确实恰好是一个奇数(它只是省略了最后一个尾随元素):

let arr = [|1;2;3;4;5|]
seq { for i in 0 .. 2 .. arr.Length - 2 -> (arr.[i], arr.[i+1]) } |> Seq.toArray

答案 2 :(得分:0)

可以使用Seq.pairwise,只要你过滤掉所有其他元组。过滤需要通过迭代传递状态,这通常由scan函数实现。

[|1..10|]
|> Seq.pairwise
|> Seq.scan (fun s t ->
    match s with None -> Some t | _ -> None )
    None
|> Seq.choose id
|> Seq.toArray
// val it : (int * int) [] = [|(1, 2); (3, 4); (5, 6); (7, 8); (9, 10)|]

但是,也可以让scan直接生成元组,惩罚中间数组。

[|1..10|]
|> Array.scan (function
| Some x, _ -> fun y -> None, Some(x, y)
| _  -> fun x -> Some x, None )
    (None, None)
|> Array.choose snd

答案 3 :(得分:-1)

使用Seq.pairwise将序列转换为元组

[|1;2;3;4;5;6|]
    |> Seq.pairwise
    |> Seq.toArray

val it : (int * int) [] = [|(1, 2); (2, 3); (3, 4); (4, 5); (5, 6)|]

应该是:

let rec slice =
    function
    | [] -> []
    | a::b::rest -> (a,b) :: slice (rest)
    | _::[] -> failwith "cannot slice uneven list"