F# 从中获取列表,其中每个列表将包含来自另一个列表集合的x位置的元素

F# 从中获取列表,其中每个列表将包含来自另一个列表集合的x位置的元素,f#,F#,基本上是这样的: [ [1;2;3]; [4;5;7]; [8;9;0]; ] 我想得到这个(垂直阅读/旋转90度): 任何人都知道在f#?中实现这一点的简单方法,我会将其转换为数组- let arr = input |> List.map (List.toArray) |> List.toArray //a array of arrays let out = Array2D.create size1 size2 (fun x y -> arr.[y].[x]) 我会转换成

基本上是这样的:

[
[1;2;3];
[4;5;7];
[8;9;0];
]
我想得到这个(垂直阅读/旋转90度):


任何人都知道在f#?

中实现这一点的简单方法,我会将其转换为数组-

let arr = input |> List.map (List.toArray) |> List.toArray //a array of arrays
let out = Array2D.create size1 size2 (fun x y -> arr.[y].[x])

我会转换成数组-

let arr = input |> List.map (List.toArray) |> List.toArray //a array of arrays
let out = Array2D.create size1 size2 (fun x y -> arr.[y].[x])

您需要的是矩阵变换

电源组 最简单的方法是使用
Microsoft.FSharp.Math.Matrix
模块具有
Transpose
方法

简单算法 如果您更喜欢自己的解决方案,这里有一个演示了短代码和执行效率的良好结合:

let rec transpose = function
    | (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
    | _ -> []

// use
[[1; 2; 3]; [4; 5; 6]; [7; 8; 9]]
|> transpose
|> printfn "%A"
就地矩阵变换
另一种方法是。它的复杂性为O(n),但需要可变数据。

您需要的是矩阵转置

电源组 最简单的方法是使用
Microsoft.FSharp.Math.Matrix
模块具有
Transpose
方法

简单算法 如果您更喜欢自己的解决方案,这里有一个演示了短代码和执行效率的良好结合:

let rec transpose = function
    | (_::_)::_ as M -> List.map List.head M :: transpose (List.map List.tail M)
    | _ -> []

// use
[[1; 2; 3]; [4; 5; 6]; [7; 8; 9]]
|> transpose
|> printfn "%A"
就地矩阵变换
另一种方法是。它具有O(n)的复杂性,但需要可变数据。

我不会对此投反对票,但如果您自己努力找到解决方案,您可能应该让人们知道您所做的。现在你的问题是“请把密码给我”,不管你是不是有意的。@OnorioCatenacci我很抱歉,这确实是我的问题,我可以用C#来做这件事,但用F#我只是不知道很多stuff@OnorioCatenacci从技术上讲,它的拼写是“请给我代码”。@ChuckNorris请看“转置”@JonHarrop谢谢你的帮助-我不会否决这一点,但如果你自己做出任何努力来解决这个问题,你可能应该让人们知道你做了什么。现在你的问题是“请把密码给我”,不管你是不是有意的。@OnorioCatenacci我很抱歉,这确实是我的问题,我可以用C#来做这件事,但用F#我只是不知道很多stuff@OnorioCatenacci从技术上讲,它的拼写是“请给我代码”。@ChuckNorris请看“转置”@JonHarrop谢谢你的帮助-PI得到了一些奇怪的
(int->int->int32)[,]=[;;;;…
结果,将Array2D.create更改为Array2D.init,我得到了数字第一部分应该缩短为
让arr=input |>Array2D
。我得到了一些奇怪的
(int->int->int32)[,]=[[;;;…
results,将Array2D.create更改为Array2D.init,我得到了数字第一部分应该缩短为
let arr=input |>Array2D