首先,这是代码:
def check_sudoku(n):
d=len(n)
i=0
s=1
while i<d:
print "i=",i
while s<d:
print "s=",s
if n[0][i]==n[s][i]:
return False
s=s+1
i=i+1
return True
我想要做的是,在s
的值从1
更改为d
后,它再次循环,i
的值发生变化。
但在我的代码中,i
的值根本没有变化。
要清楚我想做什么, 说
n =[[1,2,3,4],
[2,3,1,3],
[3,1,2,3],
[4,4,4,4]]
我希望发生以下情况:
首先应检查
n[0][0]==n[1][0]
n[0][0]==n[2][0]
n[0][0]==n[3][0]
之后i
的值应增加1
那么它应该是这样的:
n[0][1]==n[1][1]
n[0][1]==n[2][1]
n[0][1]==n[3][1]
此i
的值将再次增加,同样的循环将会运行。
这种情况没有发生,我不确定为什么。 请告诉我应该做些什么来让它以我想要的方式运行。
答案 0 :(得分:3)
您不在外循环中重置s
,因此内循环只执行一次。在那之后,s < d
永远不再是真的。
答案 1 :(得分:2)
您的内部循环会增加s
,直到它大于d
,但您永远不会将其设置回1
。此外,对于当前缩进,您还会在内循环中递增i
,因此它会在内循环内到达d
,导致外部循环仅为也跑了一次。
因此,如果d
为4,则您的值将为:
i = 0, s = 1
i = 1, s = 2
i = 2, s = 3
# exit inner loop
return True
使用range()
使用for
循环要好得多,完全避免错误:
def check_sudoku(n):
for i in range(len(n)):
for s in range(1, len(n)):
if n[0][i]==n[s][i]:
return False
return True
使用range
,内部循环将始终从1
开始,每次都会调整到len(n)
,而无需显式重置。
如果您使用any()
function,则可以将整个测试折叠为一行:
def check_sudoku(n):
return not any(n[0][i] == n[s][i] for i in range(len(n)) for s in range(1, len(n)))
答案 2 :(得分:1)
除了解开答案之外,这是修改后的代码应该有效。我已经改变了代码和运算符中的空格,这是大多数Python程序员认为更常规的方式。
def check_sudoku(n):
d = len(n)
i = 0
s = 1
while i < d:
print "i=",i
while s < d:
print "s=",s
if n[0][i] == n[s][i]:
return False
s += 1
i += 1
s = 1
return True
n =[[1,2,3,4],
[2,3,1,3],
[3,1,2,3],
[4,4,4,4]]
check_sudoku(n)
答案 3 :(得分:-1)
我认为你应该在第二个循环中移动声明i = i + 1,如下所示:
def check_sudoku(n):
d=len(n)
i=0
s=1
while i<d:
print "i=",i
while s<d:
print "s=",s
if n[0][i]==n[s][i]:
return False
s=s+1
i=i+1
return True