Проверьте список внутри списка на равное количество и пустое место - PullRequest
0 голосов
/ 09 октября 2018

Я пытался составить список внутри списка.Где я проверяю, есть ли одинаковое количество чисел внутри каждого списка, и возвращаю bool true / false.Я не уверен, что сделал все правильно, и он также должен проверить, являются ли каждый список пустым, и вернуть true или false.я не могу обернуть голову вокруг этого.спасибо вперед!Могу ли я сделать этот код более простым и как я могу проверить, если пусто и вернуть 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)

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы можете превратить ответ @ 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 там вместо этого), и если нет, это работает на хвосте.Если он пуст, список имеет один элемент и, таким образом, тривиально является таблицей;в противном случае убедитесь, что все списки имеют одинаковую длину с первым списком.

0 голосов
/ 09 октября 2018

В 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
...