几天前,我发现了如何通过对collections.abc中的Mutable Sequence进行子类化来实现海关列表类的下一个示例.
class TypedList(MutableSequence):
def __init__(self, oktypes, *args):
self.oktypes = oktypes
self.list = list()
self.extend(list(args))
def check(self, v):
if not isinstance(v, self.oktypes):
raise TypeError(v)
def __len__(self): return len(self.list)
def __getitem__(self, i): return self.list[i]
def __delitem__(self, i): del self.list[i]
def __setitem__(self, i, v):
self.check(v)
self.list[i] = v
def insert(self, i, v):
self.check(v)
self.list.insert(i, v)
def __str__(self):
return str(self.list)
TypedList的使用示例:
tl = TypedList(int)
# ok
tl.append(1)
# next TypeError will be raised
tl.append('1')
我的问题:
我想知道是否有方法以类似的方式实现二维数独数组(MutableSequence)类,以管理游戏中的数独数组?
为了给您一个 idea ,下面您可以看到SudokuArray(MutableSequence)的可能实现(非操作):
class SudokuArray(MutableSequence):
def __init__(self, n_rows=9, n_columns=9, init_value=None):
self.n_rows = n_rows
self.n_columns = n_columns
self.array = [[init_value for _ in range(0, self.n_columns, 1)] for _ in range(0, self.n_rows, 1)]
def check(self, row_number, column_number, number):
if number in self.get_row_values(row_number) or
number in self.get_column_values(column_number) or
number in self.get_nonet_values(row_number, column_number)):
raise ExistentNumberError("Existent number in row, column or nonet",
number, row_number, column_number)
def __len__(self): return self.n_rows, self.n_columns
def __getitem__(self, row_number, column_number): return self.array[column_number][row_number]
def __delitem__(self, row_number, column_number): del self.array[column_number][row_number]
def __setitem__(self, row_number, column_number, number):
self.check(number, row_number, column_number)
self.array[column_number][row_number] = number
def insert(self, row_number, column_number, number):
self.check(row_number, column_number, number)
self.array.insert(row_number, column_number, number)
def __str__(self):
return str(self.array)
def get_row_values(self, row_number):
# todo implement get_row_values method
pass
def get_column_values(self, column_number):
# todo implement get_column_values method
pass
def get_nonet_values(self, row_number, column_number):
# todo implement get_nonet_values method
pass
class ExistentNumberError(Exception):
def __init__(self, message, number, row_number, column_number):
super().__init__(message)
self.number = number
self.row_number = row_number
self.column_number = column_number
SudokuArray的使用示例:
sudoku_array = SudokuArray()
sudoku_array[0][0] = 1
# next ExistentNumberError will be raised
sudoku_array[0][0] = 1
当然,我可以使用numpy.Array,但我认为我们的9 x9数组对于使用numpy来说非常简单.我还想避免依赖性.
有主意吗?