To je nějaký blackbox, ne 
from math import sqrt
class Sudoku(object):
def __init__(self, lol):
l, lsq = len(lol), int(sqrt(len(lol)))
rows = map(set, lol)
cols = map(set, zip(*lol))
res_ok = [set(range(1, l + 1))] * l * 3
sqs = []
for srow in zip(*[iter(lol)]*lsq):
for sq in zip(*[iter(zip(*srow))]*lsq):
sqs.append(set(sum(sq, ())))
ok = rows + cols + sqs == res_ok
self.ok = ok and map(type, sum(lol, [])) == [int] * l * l
def is_valid(self):
return self.ok
tohle je asi lepší způsob, neupdatuje množiny po jednom prvku, ale zase je třeba znát idiom pro chunkování pole.