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

时间:2012-06-01 10:55:58

标签: f#

基本上有这个:

[
[1;2;3];
[4;5;7];
[8;9;0];
]

我想得到这个(垂直读/转90度):

[
[1;4;8];
[2;5;9];
[3;7;0];
]

任何人都知道在f#中执行此操作的简单方法吗?

2 个答案:

答案 0 :(得分:5)

我会通过转换为数组来实现 -

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 :(得分:4)

您需要的是矩阵换位

的PowerPack

最简单的方法是使用FSharp.PowerPack; 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"

就地矩阵转置

另一种方法是in-place matrix transposition。它具有O(n)的复杂性,但需要可变数据。