我们说我有一个数组
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)|]
这不是我想要的
答案 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"