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 

私がやりたいのは、の値がからに変更された後、再びsループして値が変更されることです。しかし、私のコードでは、の値はまったく変化していません。1dii

私がやりたいことを明確にするために、

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]
    

    その後、の値はi1増加するはずです

  • 次に、次のようになります。

    n[0][1]==n[1][1]
    n[0][1]==n[2][1]
    n[0][1]==n[3][1]
    

この後、の値はi再び増加し、この同じループが実行されます。

これは起こっておらず、理由はわかりません。思い通りに動作させるためにどのような変更を加える必要があるか教えてください。

4

4 に答える 4

3

外側のループではリセットしないsため、内側のループは1回だけ実行されます。その後、s < d二度と真実になることはありません。

于 2012-08-29T07:57:58.797 に答える
2

内側のループsは、より大きくなるまで増分しますdが、に戻すことはありません1。また、現在のインデントでは、内側のループもインクリメントiするため、内側のループの内側に到達dし、外側のループも1回だけ実行されます。

したがって、dが4の場合、値は次のようになります。

i = 0, s = 1
i = 1, s = 2
i = 2, s = 3
# exit inner loop
return True

forを使用してループを使用する方がはるかに優れて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()この関数を使用すると、テスト全体を1行にまとめることができます。

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

さらに答えを解くために、これは機能するはずの方法で変更されたコードです。ほとんどの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を2番目のループに移動する必要があると思います。

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 に答える