【问题标题】:Lists: Combine each first, second, third elements in a list of sublists列表:将每个第一个、第二个、第三个元素组合到一个子列表列表中
【发布时间】:2018-10-04 18:47:56
【问题描述】:

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

所以

[ [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] ] ))

我不确定如何处理这个问题。我想我需要使用地图,并以某种方式遍历每个子列表并提取每个元素。但任何帮助都会很好!

【问题讨论】:

    标签: f#


    【解决方案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)
    

    【讨论】:

    • 非常感谢托马斯!我还没有学习递归函数,但我要学习一下!非常感谢您抽出宝贵的时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2022-08-05
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多