Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一行代码中设置整列的值_Python_For Loop_Matrix - Fatal编程技术网

Python 在一行代码中设置整列的值

Python 在一行代码中设置整列的值,python,for-loop,matrix,Python,For Loop,Matrix,我在做一个问题“给定一个矩阵,大小为M x N,大小为0s和1s。如果一个元素为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):

我在做一个问题“给定一个矩阵,大小为M x N,大小为0s和1s。如果一个元素为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]

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

如果使用普通列表,则必须使用
进行循环:

 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)

我正在努力寻找一个实际的应用程序。您能举个例子吗?您可以对矩阵使用
numpy.ndarray
,然后进行转置,将一行设置为“0”,然后重新转置。但是@Michael link更好。如果您使用普通列表,那么您将不得不对范围(r)中的y使用
-循环:
:A[y][j]=0
BTW:以类似的方式,您可以为范围(c)中的x编写行-
:A[i][x]=0