Копии и привязки между объектами Python - PullRequest
1 голос
/ 22 октября 2019

Учитывая матрицу, A размером M x N, равным 0 с и 1 с. Если элемент равен 0, установите для всей его строки и столбца значение 0.

Input 1:
    [   [1, 0, 1],
        [1, 1, 1], 
        [1, 1, 1]   ]

Output 1:
    [   [0, 0, 0],
        [1, 0, 1],
        [1, 0, 1]   ]

Мой код:

def setZeroes(self, A):
    B=A
    for i in range(len(A)):
        for j in range(len(A[i])):
            if(A[i][j]==0):
                for x in range(len(A[i])):
                    B[i][x]=0
                    for y in range(len(A)):
                        B[y][j]=0
        A=B
    return A

Создает нулевую матрицу. Что мне не хватает?

Ответы [ 6 ]

2 голосов
/ 22 октября 2019

Вы можете сделать это, маскируя строки и столбцы нулем

mask = A==0
A[:, mask.any(0)] = 0
A[mask.any(1)] = 0
print(A)
array([[0, 0, 0],
       [1, 0, 1],
       [1, 0, 1]])
1 голос
/ 22 октября 2019

Это полная реализация Python, которая корректно меняет A на месте, включая изменение столбцов

def set_zero(A):
    columns = set()
    for row_nr, row in enumerate(A):
        if 0 in row:
            columns |= {i for i, c in enumerate(row) if c == 0}
            A[row_nr] = [0] * len(row)
    for row_nr,  row in enumerate(A):
        A[row_nr] = [0 if i in columns else c for i, c in enumerate(row)]
1 голос
/ 22 октября 2019

Это простой ответ, который не изменяет А, но создает другую возвращаемую матрицу:

from more_itertools import locate


def setZeroes(A):
    indexPosList = []   #  will contains all the zeroable indices
    result = []  # the result matrix
    for i in A:
        indexPosList.extend(list(locate(i, lambda a: a == 0)))
        if 0 in i:
            result.append([0]*len(i))
        else:
            for idx in indexPosList:
                i[idx] = 0
            result.append(i)
    return result


Образец теста:

>>> A = [[1, 0, 1], [1, 1, 1], [1, 1, 1]]
>>> setZeroes(A)
[[0, 0, 0], [1, 0, 1], [1, 0, 1]]
1 голос
/ 22 октября 2019

Ваша проблема прямо здесь:

B=A

Это не создает три новых массива для строк B: это заставляет B указывать на те же массивы, что и A. Так что, как только вы установитеВ первой строке и столбце нули есть дополнительные нули, которые обнаруживает ваш цикл. Скопируйте каждую строку (или глубокую копию), чтобы избежать проблемы.

1 голос
/ 22 октября 2019
def func(l):    
    r = []
    c = []

    # storing the index value of coloum and row where there is 0 everywhere
    for i,v1 in enumerate(l):
        for j,v2 in enumerate(v1):
            if v2 ==0:
                c.append(j)
                r.append(i)
    r = list(set(r))
    c = list(set(c))

    # making all element of row 0
    for i in r:
        for j in range(len(l[i])):
            l[i][j] = 0

    # making lal element of coloumn 0
    for i in c:
        for j in range(len(l)):
            l[j][i] = 0
    return l


l = [   [1, 0, 1],
        [1, 1, 1], 
        [1, 1, 1]   ]

res = func(l)

print(res,sep='\n')

вывод:

[
 [0, 0, 0],
  [1, 0, 1],
  [1, 0, 1]
]
1 голос
/ 22 октября 2019
import copy

def setZeroes(A):
   B=copy.deepcopy(A)
   for i in range(len(A)):
       for j in range(len(A[i])):
           if(A[i][j]==0):
               for x in range(len(A[i])):
                   B[i][x]=0
               for y in range(len(A)):
                   B[y][j]=0
   return B

A =  [   [1, 0, 1],
        [1, 1, 1], 
        [1, 1, 1]   ]

print(setZeroes(A))

, так как, массив передается по ссылке, вы должны копировать его.

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