2013-04-07 2 views
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. Я экспериментировал abit и попробовал

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] (http://docs.python.org/library/sets.html). – hd1

+1

Спойлер: после того, как вы закончили свой решатель, google для «Norvig sudoku» – georg

ответ

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

Это генератор можно использовать в списках одинаковой длины, чтобы проверить, что индексы они 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) 
-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]'. Это также будет относиться только к спискам, которые находятся в одном порядке, что имеет смысл, поскольку списки упорядочены по собственному желанию, но не то, что искал искатель. –