首页 > 解决方案 > 一行代码设置一整列的值

问题描述

我正在做的问题是“给定一个矩阵,大小为 M x N 的 0 和 1 的 A。如果元素为 0,则将其整行和整列设置为 0”。所以我被困在如何更改包含值 0 的整个列的值。

def setZeroes(self, A):
        r=len(A)
        c=len(A[0])
        for i in range(r):
            for j in range(c):
                if (A[i][j]==0):
                    A[i]=[0 for j in range(c)]
                    A[0:r][j]=[0][j]

我知道这是一个糟糕的实现,但我只想知道如何将矩阵的整个列的值设置为零。

标签: pythonfor-loopmatrix

解决方案


如果您使用普通列表,那么您将不得不使用for-loop :

 for y in range(r): 
     A[y][j] = 0 

和类似的方式你可以为行编写代码

 for x in range(c): 
     A[i][x] = 0

所以你需要

 if A[i][j] == 0:
     for y in range(r): 
         A[y][j] = 0 
     for x in range(c): 
         A[i][x] = 0

但我发现您的代码存在其他问题。您在更改值的同一数组中检查零,因此在更改行/列中的值后,您将拥有新的零,这将产生新的更改。

例如

[
    [1, 2, 3],
    [4, 0, 6],
    [7, 8, 9]
]

我希望仅在中间行和中间列中出现零

[
    [1, 0, 3],
    [0, 0, 0],
    [7, 0, 8]
]

但它创造了

[
    [1, 0, 0],
    [0, 0, 0],
    [0, 0, 0]
]

因为在中间行和中间列中放置零后,它将使用这些零在接下来的行和列中生成新的零。

您将不得不复制原始数组并检查重复数组中的零,但更改原始数组中的值

import copy

def setZeroes(A):
    temp = copy.deepcopy(A)
    r = len(A)
    c = len(A[0])
    for i in range(r):
        for j in range(c):
            if temp[i][j] == 0:
                #A[i] = [0 for j in range(c)]
                for x in range(c):
                    A[i][x] = 0
                for y in range(r):
                    A[y][j] = 0
                    
a = [
    [1, 2, 3],
    [4, 0, 6],
    [7, 8, 9]
]

print(a)
setZeroes(a)
print(a)

或者您应该首先在数组中找到所有零,然后在数组中更改值。

def setZeroes(A):
    r = len(A)
    c = len(A[0])
    
    pos = []
    
    # find all zeros 
    for i in range(r):
        for j in range(c):
            if A[i][j] == 0:
                pos.append( (i,j) )
                
    # change it
    for i, j in pos:
        for x in range(c):
            A[i][x] = 0
        for y in range(r):
            A[y][j] = 0

a = [
    [1, 2, 3],
    [4, 0, 6],
    [7, 8, 9]
]

print(a)
setZeroes2(a)
print(a)

推荐阅读