2013-04-07 59 views
0

我正在尝试制作一个Sudoku解算器,并且此刻我正在制作检查它是否已解决的部分,但我已经升级了卡住。网格是由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显示列表。我怎么能做到这一点?由于

+0

看起来你需要看看[python sets](http://docs.python.org/library/sets.html)。 – hd1 2013-04-07 09:06:32

+1

Spoiler:当你准备好你的求解器之后,Google for“Norvig sudoku” – georg 2013-04-07 09:24:36

回答

1

这是很难从你贴什么小码告诉正是你的问题所在,或为了使它工作而需要改变什么,但是根据你的问题标题和你提供的信息(你正在解决Sudoku),我可以说下面的内容会对你有所帮助。

为了比较列表中的项目是否在另一个列表中,我们必须确定范围。

让我们说我们有两个列表,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) 
-3

我不认为你可以==比较清单,但这样的事情应该工作:

len(x)==len(y) and all(x[i] == y[i] for i in range(len(x)-1)) 
+0

你可以用'=='比较python中的列表(我只在2.4.3中测试过),但顺序必须相同。此外,'range(len(x)-1)'不会将列表的最后一个元素与'range(x)'='[0,1,2,...,x-1]'进行比较。这也只能将列表按照相同的顺序排列,这很有意义,因为列表本质上是有序的,但不是提问者寻找的东西。 – 2013-04-07 09:49:35

相关问题