【问题标题】:Check list inside list for equal amount and empty space检查列表内的等量和空白空间
【发布时间】:2019-03-14 01:45:32
【问题描述】:

我试图在列表中创建一个列表。我检查每个列表内是否有相同数量的数字,并返回布尔真/假。我不确定我做对了,它还需要检查每个列表是否为空并返回真或假。我无法绕开它。提前谢谢! 我可以让这段代码更简单吗?如何检查是否为空并返回 bool true 或 false?

  let lis1 = [[ 1; 2; 3; ] ; [ 4; 5; 6; ]]

    let isTable (lis1 : 'a list list) = 
        let mutable tabellen = false
        let item0 = lis1.Item 0
        for i = 0 to (lis1.Length)-1 do 
            if item0.Length = (lis1.Item i).Length then 
                tabellen <- true
            else
                tabellen <-false
        tabellen

    printfn"%b" (isTable lis1)

【问题讨论】:

    标签: list f# boolean


    【解决方案1】:

    在 F# 中,通常最好从函数式和不可变数据类型开始,除非您绝对需要改变某些内容。

    您可以像这样映射列表以获取每个内部列表的长度:

    List.map List.length lis1
    // yields: [3; 3]
    

    然后您可以通过List.distinct 从该列表中获取不同的项目:

    List.map List.length lis1 |> List.distinct
    // yields: [3]
    

    您可以对该列表的长度进行模式匹配,并且根据您的逻辑,您可以根据结果列表中是否有单个项目来确定列表列表是否为表格。

    let isTable list =
        match List.map List.length list |> List.distinct |> List.length with
        | 1 -> true
        | _ -> false
    

    例子:

    printfn "%A" <| isTable [[ 1; 2; 3; ] ; [ 4; 5; 6; ]]
    // yields: true
    
    printfn "%A" <| isTable [[ 1; 2; ] ; [ 3; 4; 5; 6; ]]
    // yields: false
    
    printfn "%A" <| isTable []
    // yields: false
    

    【讨论】:

      【解决方案2】:

      您可以将@ChadGilbert 的答案写成一条直线(如果您不介意它有点长):

      let isTable l = 1 = l |> List.map List.length |> List.distinct |> List.length
      

      简短而甜蜜,您可以立即看到发生了什么,但效率不高,因为它会迭代列表两次。以防万一您想要一个更有效的解决方案,我想出了以下内容:

      let isTable = function
          | [] -> true
          | h :: t ->
              List.length t = 0 ||
              List.forall (fun l -> List.length h = List.length l) t
      

      这首先检查列表是否为空(我将这种情况定义为一个表,但可以随意返回false),如果不是,它在尾部工作。如果它为空,则列表只有一个元素,因此通常是一张表;否则,请检查所有列表的长度是否与第一个相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 2019-03-14
        • 1970-01-01
        • 2023-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多