Найти - Пользователи
Полная версия: Помогите написать человеческий код!
Начало » Центр помощи » Помогите написать человеческий код!
1 2
vasyank
В общем, дошел до середины задачи дальше дело стало по этическим соображением. Не могу вьехать в итераторы
Собственно что нужно? Есть список списков, он же двумерный массив 20х20. Надо найти максимальное произведение 4х рядом стоящих элементов: по горизонтали, по вертикали и по обоим диагоналям. Все что мне приходит на ум это циклы в цикле, но перелопатив инет такого не нашел, всечто увидел сделано через итераторы, но самостоятельно через итераторы сделать пока опыта не хватает.
Прошу помощи, предложите красивую реализацию этой задачи! Заранее спасибо
botinag
для вертикалей и горизонталей получилось так… некрасиво и непонятно
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)  # по вертикали
Наверное стоит посмотреть в сторону numpy. Там наверняка есть инструменты для красивого решения подобных задач.
vasyank
спс да уж, вроде задача простая а вот решение у меня проситься как в 2000 годах на паскале буду разбираться что в этом куске кода
vasyank
botinag
для вертикалей и горизонталей получилось так… некрасиво и непонятно
не смог разобраться со след кусками "z“ и ”len(matrix)-num+1)]", как то словами это межете обьяснить? z -срез понятно, но вот дальнейшие действия с ним не понятны И зачм 2 раза max вызвана?
botinag
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
vasyank
вот спс все понятно теперь осталось научиться так же компактно писать как первый вариант был. И диагонали пощитать легко этой функцией) Выведу их в обычный список, ведь функции же пофиг сколько строк 20 или одна.
botinag
vasyank
осталось научиться так же компактно писать как первый вариант был
также как у меня в первом варианте писать не стоит.
надо писать коротко, но не в ущерб для ясности… а то через пару дней не разобраться в своей же писанине.
vasyank
пытаюсь заменить функцию reduce() на map() в строке mult = reduce(lambda res, x: res*x, row), что бы не подключать доп модулей. Ругаеться на лямбдуTypeError: <lambda>() missing 1 required positional argument: ‘x’
botinag
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
vasyank
да не то что избавиться от reduce() просто нету понимания чем она отличается от map() вот и пытался заменить по аналогии list(map(labda …, z))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB