Python 对象之间的复制和绑定

问题描述 投票:0回答:6

给定一个矩阵,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

正在创建一个零矩阵。我想念什么?

python python-3.x object reference
6个回答
2
投票

您可以通过用零屏蔽行和列来做到这一点

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
投票
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))

由于数组是按引用传递的,因此您必须对其进行深度复制。


1
投票

你的问题就在这里:

B=A

这不会为 B 的行创建三个新数组:它使 B 指向与 A 相同的数组。因此,一旦将第一行和第一列设置为零,循环就会发现其他零。复制每一行(或深层复制)以避免出现问题。


1
投票

这是一个简单的答案,它不会修改 A,而是创建另一个返回的矩阵:

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
投票

这是一个完整的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
投票
def func(l):    
    r = []
    c = []
    
    # storing the index value of column 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 column 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]
]
© www.soinside.com 2019 - 2024. All rights reserved.