Помогите с решением задачи (нужно точки заменить на звездочки)
Код этой задачи:
Проблема в том, что я на 30 строке , где j == 3 (тройку я поставил от руки(подогнал под решение)) чтобы печатались центральные вертикальная и горизонтальная строки из звездочек. Прошу Вас помочь, подсказать, объяснить что нужно поставить в последнем блоке кода чтобы печатались центральные вертикальная и горизонтальные строки из звездочек(*) вместо точек(.)
Ответы (1 шт):
На скиншоте многабуков, ниасилил.
Но, видимо, решение выглядит как-то так:
n = int(input())
matrix = [['.']*n for _ in range(n)]
for i in range(n):
matrix[i][i] = matrix[i][n-i-1] = matrix[i][n//2] = '*'
matrix[n//2] = ['*']*n
print(*map(' '.join, matrix), sep='\n')
Подробности
Конструкция вида ['.']*n создаёт список длиной n состоящий из элементов '.'. (Т.е., к примеру, запись [7]*4 породит список [7,7,7,7]) Таким образом генерируется ряд матрицы.
Чтобы заполнить матрицу такими рядами, всё действо просто повторяется в цикле [... for _ in range(n)]. Данная запись эквивалентна обычному циклу с вызовом append(...):
for _ in range(n):
matrix.append(['.']*n)
Дальше заполняем матрицу звёздочками:
for i in range(n):
matrix[i][i] = '*' # главная диагональ
matrix[i][n-i-1] = '*' # побочная диагональ
matrix[i][n//2] = '*' # средний столбец
Если идет присваивание одного и того же значения нескольким переменным, то можно не городить кучу однотипных строк, а просто записать в виде однострочной конструкции как, например, a = b = c = d = 5 (т.е. всем перечисленным переменным будет присвоено значение 5).
Ну и в конце просто присваиваем средней строке матрицы список из одних звёздочек matrix[n//2] = ['*']*n.
Вывод на экран
Тут немного tricky...
Символ * говорит Питону, что элементы списка надо раскидать по аргументам. Т.е., к примеру, строка print(*[1,2,3]) сделает поэлементную постановку списка в аргументы, и, по сути, она как бы превратится в print(1,2,3).
Разделитель по умолчанию является пробел, но аргументом sep='\n' меняется на перевод строки. Таким образом, если просто позвать print(*matrix, sep='\n'), каждая строка матрицы пойдёт как отдельный аргумент в команду print(), и будет напечатана этой командой с новой строки (так как аргументы печатаются через разделитель, а он был заменён на перевод строки \n).
Но строки матрицы всё ещё списки, и будут напечатаны как списки, если ничего не предпринимать. Поэтому просто клеим списки через пробел (при помощи функции join()). Для этого задействуем функцию map() которая идёт по списку и для каждого элемента вызывает функцию, которую указали первым аргументом. Т.е., например, list(map(str, [1,2,3])) преобразует каждое число в строку и вернёт список ['1', '2', '3'].
Сам join() работает очень просто - он собирает (клеит) элементы списка в строку используя строку, от которой его вызвали, как разделитель. Например, '<>'.join([1,2,3]) вернёт строку '1<>2<>3'. В нашем случае в качестве разделителя используется строка содержащая пробел.
Короче, print(*map(' '.join, matrix), sep='\n') преобразует каждый ряд матрицы из списка в строку через пробел при помощи map() через ' '.join(); из-за того, что указана * - распихивает эти ряды по отдельным аргументам команды print(), которая выводит ряды построчно, потому как указан разделитель \n.

