列表:将每个第一,第二,第三元素组合在一个子列表中

时间:2018-10-04 08:21:47

标签: f#

我正在尝试将每个元素压缩/连接在一起。

所以

[ [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,并以某种方式遍历每个子列表并提取每个元素。但是任何帮助都很好!

1 个答案:

答案 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)