Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 19, 2014 00:42:03

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

В общем, дошел до середины задачи дальше дело стало по этическим соображением. Не могу вьехать в итераторы
Собственно что нужно? Есть список списков, он же двумерный массив 20х20. Надо найти максимальное произведение 4х рядом стоящих элементов: по горизонтали, по вертикали и по обоим диагоналям. Все что мне приходит на ум это циклы в цикле, но перелопатив инет такого не нашел, всечто увидел сделано через итераторы, но самостоятельно через итераторы сделать пока опыта не хватает.
Прошу помощи, предложите красивую реализацию этой задачи! Заранее спасибо

Офлайн

#2 Ноя. 19, 2014 10:18:07

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

для вертикалей и горизонталей получилось так… некрасиво и непонятно

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. Там наверняка есть инструменты для красивого решения подобных задач.

Отредактировано botinag (Ноя. 19, 2014 11:31:41)

Офлайн

#3 Ноя. 19, 2014 11:08:29

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

спс да уж, вроде задача простая а вот решение у меня проситься как в 2000 годах на паскале буду разбираться что в этом куске кода

Офлайн

#4 Ноя. 20, 2014 15:44:13

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

botinag
для вертикалей и горизонталей получилось так… некрасиво и непонятно
не смог разобраться со след кусками "z“ и ”len(matrix)-num+1)]", как то словами это межете обьяснить? z -срез понятно, но вот дальнейшие действия с ним не понятны И зачм 2 раза max вызвана?

Отредактировано vasyank (Ноя. 20, 2014 17:19:44)

Офлайн

#5 Ноя. 20, 2014 18:20:12

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

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)

Офлайн

#6 Ноя. 20, 2014 19:21:27

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

вот спс все понятно теперь осталось научиться так же компактно писать как первый вариант был. И диагонали пощитать легко этой функцией) Выведу их в обычный список, ведь функции же пофиг сколько строк 20 или одна.

Офлайн

#7 Ноя. 20, 2014 19:32:14

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

vasyank
осталось научиться так же компактно писать как первый вариант был
также как у меня в первом варианте писать не стоит.
надо писать коротко, но не в ущерб для ясности… а то через пару дней не разобраться в своей же писанине.

Офлайн

#8 Ноя. 20, 2014 23:28:43

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

пытаюсь заменить функцию reduce() на map() в строке mult = reduce(lambda res, x: res*x, row), что бы не подключать доп модулей. Ругаеться на лямбдуTypeError: <lambda>() missing 1 required positional argument: ‘x’

Отредактировано vasyank (Ноя. 20, 2014 23:29:27)

Офлайн

#9 Ноя. 21, 2014 07:35:03

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

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

Офлайн

#10 Ноя. 21, 2014 10:37:48

vasyank
Зарегистрирован: 2014-11-19
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите написать человеческий код!

да не то что избавиться от reduce() просто нету понимания чем она отличается от map() вот и пытался заменить по аналогии list(map(labda …, z))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version