Не работают вычисления для матрицы 1xm и nx1 в Python (не NumPy)

#python #matrix

#python #матрица

Вопрос:

Я новичок в Python. У меня такая задача:

Напишите программу, которая получает прямоугольную матрицу в виде последовательности строк в качестве входных данных. За последней строкой матрицы следует строка, содержащая только строку «end».

Программа должна выводить матрицу того же размера, в которой каждый элемент в позиции i, j равен сумме элементов первой матрицы в позициях (i-1, j), (i 1, j), (i, j-1), (i, j-1)., j 1). Для крайних символов соседний элемент находится на противоположной стороне матрицы.

В случае одной строки / столбца сам элемент является соседом в соответствующем направлении.

Например

Пример ввода 1:

 9 5 3
0 7 -1
-5 2 9
end
 

Пример вывода 1:

 3 21 22
10 6 19
20 16 -1
 

Я написал код, который работает для прямоугольных и квадратных матриц, но я не знаю, как заставить его работать с матрицами 1 x m и n x 1.

 l2 = []
l3 = []
length = 0
width = 0
while True:
    x = input()
    if x == 'end':
        break
    else:
        length = 0
        for i in x:
            if i.isdigit():
                length =1
        l2.append(x)
        width =1

for i in l2:
    l3.append(i.split(" "))
converted = [[int(i) for i in s] for s in l3]
for i in range(0,width):
    for j in range(0,length):
            if j==length-1:
                j = -1
            if i==width-1:
                i = -1
            print((converted[i-1][j] converted[i][j-1]) (converted[i][j 1] converted[i 1][j]), end = " ")
    print(end = "n")
 

Также я не могу использовать какие-либо классы, функции или библиотеки.

Кто-нибудь знает, как я могу это исправить?

P.S. Если кто-нибудь предложит короткий код, я буду очень благодарен.

Ответ №1:

Да, вам нужно обработать оба ребра. Вы не совсем это делаете. В частности, когда ширина равна 1, вы устанавливаете j = -1, а затем пытаетесь использовать j-1, который находится вне диапазона.

 l2 = []
while True:
    x = input()
    if x == 'end':
        break
    l2.append( [int(k) for k in x.split()] )
width = len(l2)
length = len(l2[0])
converted = l2
for i in range(width):
    for j in range(length):
        im1 = (i-1)%width
        ip1 = (i 1)%width
        jm1 = (j-1)%length
        jp1 = (j 1)%length
        print((converted[im1][j] converted[i][jm1]) (converted[i][jp1] converted[ip1][j]), end = " ")
    print()
 

Комментарии:

1. В качестве дополнительного комментария вы устанавливаете «width» на количество строк, а «length» — на длину каждой строки. Это как бы наоборот. Для них вы можете использовать «высоту» и «ширину».