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 

我想要做的是,在s1to的值更改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将再次增加之后,这个相同的循环将运行。

这没有发生,我不知道为什么。请告诉我应该进行哪些更改以使其按我想要的方式运行。

4

4 回答 4

3

您不会s在外循环中重置,因此内循环只会执行一次。在那之后,s < d再也不会是真的了。

于 2012-08-29T07:57:58.797 回答
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

你最好使用for循环 using range(),完全避免你的错误:

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()功能,您可以将整个测试折叠成一行:

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)))
于 2012-08-29T08:05:01.527 回答
1

除了 unwind 的答案,这是修改后的代码,应该可以工作。我以大多数 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)
于 2012-08-29T08:13:40.240 回答
-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
于 2012-08-29T08:03:02.680 回答