А вот и табличка. Я бы, честно говоря, реализовал её совсем по-другому, и было бы намного компактнее. Но раз у вас хотят словарь - пусть будет словарь.
class Cell:
def __init__(self, value):
self.value = value
class SparseTable:
def __init__(self):
self.rows = 0
self.cols = 0
self.data = {}
def add_data(self, row, col, data):
self.data[(row, col)] = data
if self.rows <= row: self.rows = row + 1
if self.cols <= col: self.cols = col + 1
def remove_data(self, row, col):
if (row, col) in self.data:
del self.data[(row, col)]
if self.rows == row + 1 or self.cols == col + 1: self.recalc()
else:
raise IndexError('ячейка с указанными индексами не существует')
def __getitem__(self, key):
if key in self.data:
return self.data[key].value
else:
raise ValueError('данные по указанным индексам отсутствуют')
def __setitem__(self, key, value):
self.add_data(key[0], key[1], Cell(value))
def recalc(self):
self.rows = max(k[0] for k in self.data) + 1
self.cols = max(k[1] for k in self.data) + 1
st = SparseTable()
st.add_data(2, 5, Cell(25))
st.add_data(1, 1, Cell(11))
assert st.rows == 3 and st.cols == 6, "неверные значения атрибутов rows и cols"
st = SparseTable()
В каждом объекте этого класса должны создаваться локальные публичные атрибуты:
rows - общее число строк таблицы (начальное значение 0);
cols - общее число столбцов таблицы (начальное значение 0).
В самом классе SparseTable должны быть объявлены методы:
add_data(row, col, data) - добавление данных data (объект класса Cell) в таблицу по индексам row, col (целые неотрицательные числа);
remove_data(row, col) - удаление ячейки (объект класса Cell) с индексами (row, col).
При удалении/добавлении новой ячейки должны автоматически пересчитываться атрибуты rows, cols объекта класса SparseTable. Если происходит попытка удалить несуществующую ячейку, то должно генерироваться исключение:
raise IndexError('ячейка с указанными индексами не существует')
Ячейки таблицы представляют собой объекты класса Cell, которые создаются командой:
data = Cell(value)
где value - данные ячейки (любой тип).
Хранить ячейки следует в словаре, ключами которого являются индексы (кортеж) i, j, а значениями - объекты класса Cell.
Также с объектами класса SparseTable должны выполняться команды:
res = st[i, j] # получение данных из таблицы по индексам (i, j)
st[i, j] = value # запись новых данных по индексам (i, j)
Чтение данных возможно только для существующих ячеек. Если ячейки с указанными индексами нет, то генерировать исключение командой:
raise ValueError('данные по указанным индексам отсутствуют')
При записи новых значений их следует менять в существующей ячейке или добавлять новую, если ячейка с индексами (i, j) отсутствует в таблице. (Не забывайте при этом пересчитывать атрибуты rows и cols).
P.S. В программе нужно объявить только классы. Выводить на экран ничего не нужно.
Для примера:
Тест
st = SparseTable()
st.add_data(2, 5, Cell(25))
st.add_data(1, 1, Cell(11))
assert st.rows == 3 and st.cols == 6, "неверные значения атрибутов rows и cols"
Результат