检查列表内的列表中是否有相等的数量和空白

时间:2018-10-09 10:03:28

标签: list f# boolean

我试图在列表中创建一个列表。我在每个列表中检查是否有相同数量的数字,并返回布尔值true / false。我不确定我做对了吗,还需要检查每个列表是否为空并返回true或false。我不能把头缠住它。谢谢你! 我可以使这段代码更简单吗,如何检查是否为空并返回布尔值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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将@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),如果不是,则在末尾工作。如果为空,则列表只有一个元素,因此平时就是一个表。否则,请检查所有列表的长度是否与第一个列表相同。