Списки: объедините каждый первый, второй, третий элементы в списке подсписков - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь сжать / объединить каждый элемент друг с другом.

Так что

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

будет

[ [1;4;7]; [2;5;6]; [3;6;9] ]

Мой первый подходдолжен был использовать почтовый индекс.Но это не сработало

let transpose (lst : 'a list list)  = 

    List.map List.zip lst

printfn "%A" ( transpose (  [[1;2;3]; [4;5;6]]  ) ) 

Другой подход, который я попробовал, был такой:

// Helper function
let firstColumn (lst : 'a list list): 'a list  =

    List.map List.head lst

// Helper function
let dropFirstColumn (lst : 'a list list): 'a list list  =

    List.map List.tail lst

// Main function
let transpose (lst: 'a list list) = 

    firstColumn(dropFirstColumn(lst))

printfn "%A" (transpose ( [ [1;2;3];[4;5;6] ] ))

Я не уверен, как подойти к этому,Я думаю, что мне нужно использовать карту, и каким-то образом перебирать каждый подсписок и извлекать каждый элемент.Но любая помощь может быть хорошей!

1 Ответ

0 голосов
/ 04 октября 2018

Ваш второй подход идет в правильном направлении - ваша функция firstColumn правильно создает первый столбец, а ваша dropFirstColumn дает вам данные для оставшихся строк вашей матрицы.

Все, чего не хватаетв том, что вам нужно соединить эти два элемента и вызывать их рекурсивно, пока вложенные списки в вашем основном списке не станут пустыми.Один из способов сделать это (который работает, но не очень хорошо обрабатывает некорректные входные данные) будет выглядеть следующим образом:

let firstColumn (lst : 'a list list): 'a list  =
    List.map List.head lst

let dropFirstColumn (lst : 'a list list): 'a list list  =
    List.map List.tail lst

let rec transpose list = 
  if List.isEmpty (List.head list) then [] else
    firstColumn list ::
    transpose (dropFirstColumn list)

Условие в if проверяет, является ли первый вложенный список пустым- при условии, что они все имеют одинаковую длину, это означает, что мы дошли до конца списка, и мы просто возвращаем пустой список.Если это не так, мы обрабатываем первый столбец, используя firstColumn list, рекурсивно обрабатываем оставшиеся столбцы, используя transpose (dropFirstColumn list), а затем соединяем два, используя ::.

. Вы можете даже встроить две свои вспомогательные функции инапишите только это:

let rec transpose list = 
  if List.isEmpty (List.head list) then [] else
    List.map List.head list ::
    transpose (List.map List.tail list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...