0

数独ソルバーを作ろうと思っていて、今は解けたかどうかをチェックする部分を作っているのですが、ちょっと行き詰ってしまいました。グリッドは 81 個の数字 (9*9) のリストで構成されており、それらを行、列、ボックスにグループ化する辞書があります。次に例を示します。

self.rows = {'toptop':self.board[0:9],'topmid':self.board[9:18],'topbottom':self.board[18:27],  
'midtop':self.board[27:36],'midmid':self.board[36:45],'midbottom':self.board[45:54]

、私が立ち往生しているビットは、各行、列、またはボックスに1〜9の数字があるかどうかを確認することです。私は少し実験して試しました

self.winning = [1,2,3,4,5,6,7,8,9]
[x for x in self.rows.values() if (x == y for y in self.winning)]

しかし、それは行にグループ化されたすべての値を返しただけです。これのバリエーションも試してみましたが、1 から 9 までの番号を持つリストを返すものもありましたが、重複していることがよくありました。1 ~ 9 のみのリストを表示することはありません。どうすればこれを達成できますか?ありがとう

4

2 に答える 2

1

あなたが投稿した小さなコードから、問題がどこにあるのか、またはそれを機能させるために何を変更する必要があるのか​​を正確に判断するのは困難ですが、質問のタイトルと提供された情報に基づいて (数独を解いていること)、私はできます以下があなたを助けると言います。

リスト内の項目が別のリストにあるかどうかを比較するには、スコープを決定する必要があります。

A と B の 2 つのリストがあるとします。

A == B
# lists are in the same order with the same items.
all(a in B for a in A)
# all items in A are in B. (order not checked)
all(b in A for b in B)
# all items in B are in A. (order not checked)
all(A[i] == B[i] for i in range(len(A)))
# all items in A are in B. (order checked) (len(A) <= len(B))
all(B[i] == A[i] for i in range(len(B)))
# all items in B are in A. (order checked) (len(B) <= len(A))

これは、等しい長さのリストで使用して、それらが True/False であるインデックスをチェックできるジェネレーターです。

def gen_diff(A, B):
    if len(A) != len(B):
        raise IndexError('lists not of same length')
    for i in range(len(A)):
        if A[i] == B[i]:
            yield (True, i)
        else:
            yield (False, i)
于 2013-04-07T09:19:03.350 に答える
-3

リストを と比較することはできないと思いますが==、次のようなものが機能するはずです。

len(x)==len(y) and all(x[i] == y[i] for i in range(len(x)-1))
于 2013-04-07T09:14:33.120 に答える