代码之家  ›  专栏  ›  技术社区  ›  Abel

翻转二维列表(或列表列表)的维度,其中每个子列表的长度相等

  •  0
  • Abel  · 技术社区  · 6 年前

    换句话说,取每个子列表的第一项并将其放入一个新列表中,取每个子列表的第二项并将其放入一个新列表等,然后返回所有这些新列表的列表。

    示例:如果输入是:

    let ls = [[1;2;3];[4;5;6];[7;8;9];[0;0;0]];;
    

    那么输出应该是:

    val it : int list list = [[1; 4; 7; 0]; [2; 5; 8; 0]; [3; 6; 9; 0]]
    

    我有工作代码,但感觉不对。它遍历列表多次,需要执行一个 List.rev 多次,必须检查内部列表中是否为空:

    let rec getInnerHeads acc skipped lst =
        match lst with
        | [] -> List.rev acc, List.rev skipped
        | item::rest ->
            match item with
            | [] -> [], skipped
            | innerHead::skip1 ->
                getInnerHeads (innerHead::acc) (skip1::skipped) rest
    
    let rec flipDimensions acc lst =
        match lst with
        | [] -> acc |> List.rev
        | z when (z |> List.forall List.isEmpty) -> acc |> List.rev
        | rest ->
            let (elem, skip1Elems) = getInnerHeads [] [] rest
            flipDimensions (elem::acc) skip1Elems
    

    以上代码的唯一优点是它是rail递归的(至少我认为是这样)。

    也许有什么 List.unfold ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   gileCAD    6 年前
    let transpose matrix =
        let rec loop acc = function
            | (_::_)::_ as m -> loop (List.map List.head m :: acc) (List.map List.tail m)
            | _ -> List.rev acc
        loop [] matrix