Почему поведение «или» изменяет поведение, а не два отдельных вызова условий? - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть эта входная матрица, и я пытаюсь создать эту выходную матрицу.

input = [[1, 1, 1], [1, 0, 1], [1, 1, 1] ]

output = [[1,0,1], [0, 0, 0], [1, 0, 1]]

, когда я вызываю функцию ниже, я получаю строка нулей, как и ожидалось:

output = [[1,1,1], [0,0,0], [1,1,1]]

def setZero(matrix):
    for i in range(0, len(matrix)):
        for j in range(0, len(matrix[i])):
            if(matrix[i][j] == 0):
                row = i
                col = j
                rowCol(matrix, row, col)
    return matrix 

def rowCol(matrix, row, col):
    for i in range(0, len(matrix)):
        for j in range(0, len(matrix[i])):
            if i == row:
                matrix[i][j] = 0

print(setZero(matrix))

, когда I вызовите функцию ниже, я получаю столбец нулей, как и ожидалось:

output = [[1,0,1], [1,0,1], [1,0,1]]

def setZero(matrix):
    for i in range(0, len(matrix)):
        for j in range(0, len(matrix[i])):
            if(matrix[i][j] == 0):
                row = i
                col = j
                rowCol(matrix, row, col)
    return matrix 

def rowCol(matrix, row, col):
    for i in range(0, len(matrix)):
        for j in range(0, len(matrix[i])):
            if j == col:
                matrix[i][j] = 0

print(setZero(matrix))

Однако, когда я комбинирую оба: if i == row or j == col:, я получаю вывод ниже:

output = [[1, 0, 0], [0, 0, 0], [0, 0 , 0]]

вместо выхода = [[1,0,1], [0, 0, 0], [1, 0, 1]]

def setZero(matrix):
    for i in range(0, len(matrix)):
        for j in range(0, len(matrix[i])):
            if(matrix[i][j] == 0):
                row = i
                col = j
                rowCol(matrix, row, col)
    return matrix 

def rowCol(matrix, row, col):
    for i in range(0, len(matrix)):
        for j in range(0, len(matrix[i])):
            if i == row or j == col:
                matrix[i][j] = 0

print(setZero(matrix))

Почему это происходит ??

1 Ответ

0 голосов
/ 29 февраля 2020

Вы модифицируете свою матрицу на месте, что означает, что тест if (matrix[i][j] == 0) в setZero видит значения, которые были изменены с помощью rowCol. Когда вы работаете только в одном измерении, вы получаете результат, который вы хотели в значительной степени случайно - вы делаете несколько дополнительных вызовов rowCol, но в итоге они обнуляют только то, что уже обнулено, поэтому проблема невидима. Но с тестом i == row or j == col это катастрофически c.

Сначала вы встречаете ноль в [1][1] и обнуляете строку 1 и столбец 1.
Затем вы встречаете только что созданный ноль в [1][2], который обнуляет столбец 2.
Затем вы встречаете ноль, который вы создали в [2][1], который обнуляет строку 2.

Итак, вы создали функцию, которая обнуляет все в той же строке, что и входной ноль, все в том же столбце, что и введите ноль, и все, что лежит или справа от входа ноль.

Что вам нужно сделать, это сделать копию matrix до того, как вы * oop над ней, и затем вы можете продолжать изменять свой выход, но вы обнуляете строку или столбец только в том случае, если значение равно нулю в неизмененной копии ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...