所以,我正在尝试创建一个数独求解器。现在,我想检查一个数字是否在它的行,列和方格中。我可以不将线,列和方形作为函数参数引入吗?有没有办法选择包含项目的列表?这是我的代码:
sudoku = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
line1 = [sudoku[0],sudoku[1],sudoku[2],sudoku[3]]
column1 = [sudoku[0],sudoku[4],sudoku[8],sudoku[12]]
square1 = [sudoku[0],sudoku[1],sudoku[4],sudoku[5]]
def sudoku_cellsolver(x):
while sudoku[x] == 0:
number = sudoku[x]+1
if number not in #"List, column, square":
sudoku[x] = number
else:
number = number + 1
#Check another time, etc
while sudoku[x] != 0:
sudoku_cellsolver(x+1)
欢迎任何帮助。当第二个分支超出范围时我也会出错,但我稍后会处理它。
编辑:
伪代码:
sudoku = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
l1 = {sudoku[0],sudoku[1],sudoku[2],sudoku[3]} #Converted to set
c1 = {sudoku[0],sudoku[4],sudoku[8],sudoku[12]} #Converted to set
sq1 = {sudoku[0],sudoku[1],sudoku[4],sudoku[5]} #Converted to set
group0 = [l1 | c1 | sq1] #Concatenation of sets
def sudoku_cellsolver(x,group):
if sudoku[x] == 0:
number = sudoku[x]+1
if number not in group:
sudoku[x] = number
主要的问题是我不能使用循环来解决一个接一个的差距,因为我不能修改参数“group0”,以便它在函数内部变为“group1”,我可以用“数独[0]“到”数独[1]“使用”数独[x] =数独[x + 1]“。
如果无法从函数内部从“group0”更改为“group1”,我将必须定义16个几乎相等的函数,其中只有“group”发生更改,并从另一个使用“if”语句决定执行16个函数中的哪一个。
答案 0 :(得分:1)
您的line1,column1和square1变量看起来像是在全局级别定义的,因此您应该能够像任何其他变量一样访问它们。您已使用if thing not in list
构造进入正确的轨道。尝试将列表连接在一起以构建一个可以检查成员资格的列表:
if number not in line1 + column1 + square1:
sudoku[x] = number
如果你需要能够确定哪些列表number
在哪里,那么这对你不起作用,但不管怎样你都不想这样做。
如果要修改函数中的全局变量,则需要使用this SO answer中所述的global
关键字。
编辑(根据评论)
现在看来您正在寻找 zip()功能。 Zip()通过索引将多个可迭代的元素组合在一起。例如:
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
groups = zip(a, b, c)
for i in xrange(3):
print(groups[i])
输出:
(1,4,7)
(2,5,8)
(3,6,9)
您可以使用zip()将元素组合在一起吗?