В вашей текущей реализации вы не получите результат max_dic
вообще, когда какая-либо часть превысит границы сетки.Часто в таких проблемах вы действительно хотите получить частичный результат.Если это так, вы, вероятно, хотите иметь возможность обрабатывать IndexError
более детально.Например, вы можете создать простую вспомогательную функцию, которая принимает сетку и два индекса и возвращает либо значение, либо некоторое значение по умолчанию (a 1
в случае умножения).
def get_val(grid, i, j, default = 1):
try:
return grid[i][j]
except IndexError:
return default
Как только вы это получитестроительный блок, нужно просто подготовить несколько списков индексов и затем использовать несколько функций из стандартной библиотеки:
from operator import mul
from functools import reduce
# Inside your two loops over i and j ...
ms = list(range(i, i + amount))
ns = list(range(j, j + amount))
rns = list(range(j, j - amount, -1))
max_dic = {
'right' : reduce(mul, [get_val(grid, i, n) for n in ns]),
'down' : reduce(mul, [get_val(grid, m, j) for m in ns]),
'down_right' : reduce(mul, [get_val(grid, m, n) for m, n in zip(ms, ns)]),
'down_left' : reduce(mul, [get_val(grid, m, n) for m, n in zip(ms, rns)]),
}