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。

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))

这是一个生成器,您可以在等长列表上使用它来检查它们是真/假的索引

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