Отразить измерения двухмерного списка (или списка списков), где каждый подсписок имеет равную длину - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть список списков, где каждый внутренний список имеет одинаковую длину, и мне нужно спроецировать его как обратное (то есть мне нужно, чтобы измерения были перевернуты).

Другими словами, взятьпервый элемент каждого подсписка и поместите его в новый список, возьмите второй элемент каждого подсписка и поместите его в новый список и т. д. Затем верните список всех этих новых списков.

Пример: если вводis:

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

Единственным преимуществом приведенного выше кода является то, что он является рекурсивным по рельсам(по крайней мере, я так думаю).

У кого-нибудь есть более эффективный, сжатый или оба алгоритма?Я проверил F # Snippets и SO, подумал, что об этом уже спрашивали, это кажется очень распространенным, но я не нашел никаких примеров.

Может быть, что-то с List.unfold?

1 Ответ

0 голосов
/ 23 декабря 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...