Судоку — проверка наличия дубликатов в строках и столбцах

#python #python-3.x #loops #for-loop #nested-loops

#python #python-3.x #циклы #for-цикл #вложенные циклы

Вопрос:

Итак, моя цель — написать программу, которая извлекает ненулевые целые числа из каждой строки и столбца и проверяет, есть ли какие-либо повторяющиеся значения, и возвращает False, если дубликаты существуют, иначе возвращает True. Он отлично работает для строк, но я изо всех сил пытаюсь получить ненулевые записи в каждом столбце. Я могу получить ненулевые записи только из одного определенного столбца, но я не знаю, как перебирать все столбцы и проверять наличие дубликатов. Я пытался использовать вложенные циклы for , но, похоже, это не работает, потому что это просто вернет список всех ненулевых целых чисел из каждого списка в L.

     def sudoku(L):
    #checks the rows
    
    for i in L:
        row=[x for x in i if x != 0]
        for j in row:
            if row.count(j)!=1:
                return False

    #checks the columns
    col=list()
    for x in range(9):
        if L[x][0]!=0:
            col.append(L[x][0])
    print(col)

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

print(sudoku(L))
 

Ответ №1:

     column = [[x[count] for x in L if x[count] != 0] for count in range(9) ]
    for c in column:
        if len(set(c)) != len(c):
            return False
        else:
            return True

 

set() удаляет все дубликаты

Код можно сократить до

     column = [[x[count] for x in L if x[count] != 0] for count in range(9) ]
    return False not in [True if len(set(c)) == len(c) else False for c in column]
 

Комментарии:

1. Хм, я думаю, что есть проблема — len(set(c))==len (c) должно быть выполнено для ВСЕХ c в столбце, я думаю, что изменение на это сработает: если все (len(set (c)) == len (c) для c в col): вернуть истину иначе: вернуть ложь

2. что вы имеете в виду?

3. вы хотите условие для каждого столбца отдельно?, я изначально думал, что вы хотели, чтобы это было, если в одном столбце есть дубликаты, а затем возвращать false для всего

4. О, я хотел, чтобы код возвращал True, если все ненулевые столбцы не имеют дубликатов, поэтому я думаю, что нам нужно использовать функцию all() для проверки всех столбцов. Я думаю, что цикл for в вашем коде будет завершен, как только он найдет ОДИН столбец, у которого len(set())==len() . Но в любом случае вы мне очень помогли, спасибо!

5. скорректирует мой ответ

Ответ №2:

Мой подход заключался бы в преобразовании одного и того же индекса для каждого столбца в строку и повторном использовании кода для строк

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

columns = []

for i in range(len(L)):
  columns.append([])
  for row in L:
    if row[i] != 0:
      columns[i].append(row[i])

print(columns) #List of columns with no 0’s