为什么这个双循环不起作用?

时间:2012-08-29 07:56:10

标签: 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=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的值将再次增加,同样的循环将会运行。

这种情况没有发生,我不确定为什么。 请告诉我应该做些什么来让它以我想要的方式运行。

4 个答案:

答案 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