Как проверить все подсписки на наличие набора обязательных элементов - PullRequest
0 голосов
/ 22 января 2020

Список будет содержать 9 подсписков из 9 номеров. Каждый подсписок должен содержать номера 1-9 в любом порядке (т. Е. Не должно быть повторений / пропущенных номеров.) Как проверить, выполняется ли это условие?

valid_list вернет true, invalid_list вернет false.

valid_list = 
       [[1,3,5,7,9,8,6,4,2],[1,2,3,4,5,6,7,8,9],[5,4,3,2,1,9,8,7,6],
        [1,3,5,7,9,8,6,4,2],[1,2,3,4,5,6,7,8,9],[5,4,3,2,1,9,8,7,6],
        [1,3,5,7,9,8,6,4,2],[1,2,3,4,5,6,7,8,9],[5,4,3,2,1,9,8,7,6]]

invalid_list =
   [[1,1,1,1,1,1,1,1,1],[2,1,2,1,2,1,2,1,2],[9,8,7,7,7,7,6,5,6],
    [1,1,1,1,1,1,1,1,1],[2,1,2,1,2,1,2,1,2],[9,8,7,7,7,7,6,5,6],
    [1,1,1,1,1,1,1,1,1],[2,1,2,1,2,1,2,1,2],[9,8,7,7,7,7,6,5,6]]

Я уверен, что все () могут сделать это, но я не могу понять, как. Я пробовал много вещей, как ..

lists = [[1, 2, 3, 4, 5, 7, 6, 8, 9], [1, 2, 3, 4, 5, 7, 6, 8, 9]]
all(x in [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]] for x in list in lists)
>>>(Would return true if not erroneous)

Ответы [ 4 ]

0 голосов
/ 22 января 2020

Вы можете удалить повторение из внутреннего списка, преобразовав в набор , а затем проверив, что набор соответствует действительному набору чисел

valid_list = [
    [1, 3, 5, 7, 9, 8, 6, 4, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [5, 4, 3, 2, 1, 9, 8, 7, 6],
    [1, 3, 5, 7, 9, 8, 6, 4, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [5, 4, 3, 2, 1, 9, 8, 7, 6],
    [1, 3, 5, 7, 9, 8, 6, 4, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [5, 4, 3, 2, 1, 9, 8, 7, 6],
]


invalid_list = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [2, 1, 2, 1, 2, 1, 2, 1, 2],
    [9, 8, 7, 7, 7, 7, 6, 5, 6],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [2, 1, 2, 1, 2, 1, 2, 1, 2],
    [9, 8, 7, 7, 7, 7, 6, 5, 6],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [2, 1, 2, 1, 2, 1, 2, 1, 2],
    [9, 8, 7, 7, 7, 7, 6, 5, 6],
]


def validate_lists(lists):
    valid_set = set(range(1, 10))
    return all(set(list_) == valid_set for list_ in lists)

print(validate_lists(valid_list) == True)
print(validate_lists(invalid_list) == False)
0 голосов
/ 22 января 2020

Мы можем использовать функцию sort и сравнить результат со списком, содержащим от 1 до 9

  def check_duplicated(lst):
        for l in lst:
            if sorted(l) != list(range(1, 10)):
                return False
        return True
0 голосов
/ 22 января 2020

Я бы определил функцию валидатора, чтобы сначала проверять подсписок. Затем вызовите этот валидатор, используя all ().

Например.

def isValidList(myList):
    return True if len(set(myList)) == 9 and max(myList) == 9 and min(myList) == 1 else False

## returns True if all sublists are valid
all(isValidList(subList) for subList in some_list)
0 голосов
/ 22 января 2020
lists = [[1, 2, 3, 4, 5, 7, 6, 8, 9], [1, 2, 3, 4, 5, 7, 6, 8, 9]]
all([[1,2,3,4,5,6,7,8,9] == sorted(el) for el in lists])

В качестве расширения, хотя вы не просили об этом, вы можете принять повторение, но отклонить пропущенные числа, преобразовав каждое list в lists в set и обратно в list.

all([[1,2,3,4,5,6,7,8,9] == sorted(list(set(el))) for el in lists])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...