我正在尝试将每个元素压缩/连接在一起。
所以
[ [1;2;3]; [4;5;6]; [7;8;9] ]
将是
[ [1;4;7]; [2;5;6]; [3;6;9] ]
我的第一种方法是使用zip。但这没用
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] ] ))
我不确定该如何处理。我想我需要使用map,并以某种方式遍历每个子列表并提取每个元素。但是任何帮助都很好!
答案 0 :(得分:1)
您的第二种方法朝着正确的方向发展-您的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)