Форум сайта python.su
0
В общем, дошел до середины задачи дальше дело стало по этическим соображением. Не могу вьехать в итераторы
Собственно что нужно? Есть список списков, он же двумерный массив 20х20. Надо найти максимальное произведение 4х рядом стоящих элементов: по горизонтали, по вертикали и по обоим диагоналям. Все что мне приходит на ум это циклы в цикле, но перелопатив инет такого не нашел, всечто увидел сделано через итераторы, но самостоятельно через итераторы сделать пока опыта не хватает.
Прошу помощи, предложите красивую реализацию этой задачи! Заранее спасибо
Офлайн
35
для вертикалей и горизонталей получилось так… некрасиво и непонятно
import random matrix = [[random.randint(0, 10) for y in range(20)] for x in range(20)] def matrix_horizontal_max(matrix, num): hor_max = max([max([reduce(lambda res, x: res*x, z[y:y+num]) for y in range(len(matrix)-num+1)]) for z in matrix]) return hor_max matrix2 = [[i[j] for i in matrix] for j in range(len(matrix[0]))] # Максимальное произведение четырех рядом стоящих элементов hor_max = matrix_horizontal_max(matrix, 4) # по горизонтали ver_max = matrix_horizontal_max(matrix2, 4) # по вертикали
Отредактировано botinag (Ноя. 19, 2014 11:31:41)
Офлайн
0
спс да уж, вроде задача простая а вот решение у меня проситься как в 2000 годах на паскале
буду разбираться что в этом куске кода
Офлайн
0
botinagне смог разобраться со след кусками "z“ и ”len(matrix)-num+1)]", как то словами это межете обьяснить?
для вертикалей и горизонталей получилось так… некрасиво и непонятно
z -срез понятно, но вот дальнейшие действия с ним не понятны
И зачм 2 раза max вызвана?
Отредактировано vasyank (Ноя. 20, 2014 17:19:44)
Офлайн
35
max мы вызываем для каждой строки матрицы для поиска максимального произведения в этой строке, а затем еще раз - для поиска максимума среди максимумов в строках матрицы.
для понимания это дело лучше переписать более развернуто:
def matrix_horizontal_max(matrix, num): list_of_max_in_rows = [] for row in matrix: # для каждой строки в матрице list_of_mult = [] for y in range(len(matrix)-num+1): # пробегаем во индексам элементов строки не доходя до конца num-1 символов, чтобы в последнее произведение попали последние num символов строки (row[y:y+num]) mult = reduce(lambda res, x: res*x, row[y:y+num]) # считаем произведение num подряд идущих элементов в строке list_of_mult.append(mult) # добавляем произведение num подряд идущих элементов в список max_of_row = max(list_of_mult) # вычисляем максимальное произведение для строки матрицы среди произведений list_of_max_in_rows.append(max_of_row) # добавляем max_of_row в список max_mult_in_matrix = max(list_of_max_in_rows) # вычисляем максимальное произведение среди максимумов для строк return max_mult_in_matrix
Отредактировано botinag (Ноя. 20, 2014 19:28:18)
Офлайн
0
вот спс все понятно теперь осталось научиться так же компактно писать как первый вариант был.
И диагонали пощитать легко этой функцией
) Выведу их в обычный список, ведь функции же пофиг сколько строк 20 или одна.
Офлайн
35
vasyankтакже как у меня в первом варианте писать не стоит.
осталось научиться так же компактно писать как первый вариант был
Офлайн
0
пытаюсь заменить функцию reduce() на map() в строке mult = reduce(lambda res, x: res*x, row), что бы не подключать доп модулей. Ругаеться на лямбду
TypeError: <lambda>() missing 1 required positional argument: ‘x’
Отредактировано vasyank (Ноя. 20, 2014 23:29:27)
Офлайн
35
vasyankесли вам так хочется избавиться от reduce(), перепишите так:
пытаюсь заменить функцию reduce()
def matrix_horizontal_max(matrix, num): list_of_max_in_rows = [] for row in matrix: # для каждой строки в матрице list_of_mult = [] for y in range(len(matrix)-num+1): # пробегаем во индексам элементов строки не доходя до конца num-1 символов, чтобы в последнее произведение попали последние num символов строки (row[y:y+num]) mult = 1 for x in row[y:y+num]: mult = mult * x list_of_mult.append(mult) # добавляем произведение num подряд идущих элементов в список max_of_row = max(list_of_mult) # вычисляем максимальное произведение для строки матрицы среди произведений list_of_max_in_rows.append(max_of_row) # добавляем max_of_row в список max_mult_in_matrix = max(list_of_max_in_rows) # вычисляем максимальное произведение среди максимумов для строк return max_mult_in_matrix
Офлайн
0
да не то что избавиться от reduce() просто нету понимания чем она отличается от map() вот и пытался заменить по аналогии list(map(labda …, z))
Офлайн