python - 一行代码设置一整列的值
问题描述
我正在做的问题是“给定一个矩阵,大小为 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]
我知道这是一个糟糕的实现,但我只想知道如何将矩阵的整个列的值设置为零。
解决方案
如果您使用普通列表,那么您将不得不使用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)
推荐阅读
- java - HTML to PDF conversion, Base64 image tag is not displaying image in PDF
- pytorch - 每批 GPU 内存增加(PyTorch)
- javascript - 单击一个按钮并打开下一个网址
- reactjs - 反应 for 循环创建无限调用
- python - PD_DF_NOT_CONTAIN
- model-view-controller - 使用 MVC 控制器作为 ClickListener 处理按钮上的 clickEvent 以查看
- laravel - Laravel - 如何使用外部 API 的参数搜索并重定向到下一页
- javascript - 无法将文本框值写入 .text 文件
- django - 带有 Q 的 Django 查询集给出了错误的长度
- r - 从ggplot图例中删除关键字母