#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