2

私はプログラミングとPythonを約1か月間、Udacityを使用して学んでいます。質問の1つとして、渡された数独リストが有効かどうかをチェックする関数を作成することになっています。

以下のforループでは、元のリストと転置されたリストの両方を使用して繰り返し処理するrowcol同時に、ステートメントの後半にzip()誤って残してしまいました。私はそれを実行しました、そして、驚いたことに、それはまだ正しい答えを返し続けました。rowor

def check_sudoku(array):  
    is_sudoku = True
    reference = range(1, len(array) + 1)
    transposed = zip(array)

    for row, col in zip(array, transposed):
        if sorted(row) != reference or sorted(row) != reference:
            is_sudoku = False
            break
    return is_sudoku

私の推測では、これはis_sudoku = Trueデフォルトで定義したためrowsであり、参照リストと比較しているため、転置が機能しなかった場合でも無効な値をキャッチします。rowしかし、2番目を置き換えたときcol、それは壊れました。

私の質問は、私の推測は正しいですか?そうでない場合、なぜこのコードが機能するのでしょうか。また、どうすればこれをより適切に記述できますか?

ありがとう!(私が渡したリストを確認したい場合は、コードパッドにも貼り付けます-http: //codepad.org/IXDlZuUu

4

1 に答える 1

0

正しい値がFalseの場合、ある時点で関数が機能するためsorted(row) != referenceです。それを書き直すことに関しては、私はこのような何かがより明確になると思います:

def check_sudoku(array):  
    reference = range(1, len(array) + 1)
    transposed = zip(array)
    for row, col in zip(array, transposed):
        if sorted(row) != reference or sorted(row) != reference:
            return False
    return True

さらに、なぜあなたがそうするのかtransposed = zip(array)、そしてそれから私が理解するのはかなり難しいですzip(array, transposed)。私が知る限り、それはのようなリストを取り、[1, 2, 3]それをに変換し[(1, (1,)), (2, (2,)), (3, (3,))]ます。

行と列を反復処理する場合は、次の1つの方法が機能します。

>>> rows = incorrect
>>> cols = [[row[i] for i in range(len(rows[0]))] for row in rows]
>>> cols = [[row[i] for row in rows] for i in range(len(row))]
>>> cols
[[4, 6, 3, 9, 7, 8, 1, 5, 2], [1, 5, 9, 6, 3, 2, 4, 8, 7], [2, 8, 7, 4, 5, 1, 9, 3, 6], [3, 9, 5, 2, 1, 7, 6, 4, 8], [6, 4, 2, 3, 8, 9, 5, 7, 1], [7, 1, 8, 5, 4, 6, 3, 2, 9], [8, 3,
 1, 7, 6, 4, 2, 9, 5], [5, 2, 6, 8, 9, 3, 7, 1, 4], [1, 7, 4, 1, 2, 5, 8, 6, 3]]
>>> rows
[[4, 1, 2, 3, 6, 7, 8, 5, 1], [6, 5, 8, 9, 4, 1, 3, 2, 7], [3, 9, 7, 5, 2, 8, 1, 6, 4], [9, 6, 4, 2, 3, 5, 7, 8, 1], [7, 3, 5, 1, 8, 4, 6, 9, 2], [8, 2, 1, 7, 9, 6, 4, 3, 5], [1, 4,
 9, 6, 5, 3, 2, 7, 8], [5, 8, 3, 4, 7, 2, 9, 1, 6], [2, 7, 6, 8, 1, 9, 5, 4, 3]]
于 2012-04-13T17:02:09.820 に答える