鱼C论坛

 找回密码
 立即注册
查看: 1274|回复: 3

零基础入门python课后作业23QAQ真的不理解呀大佬救命

[复制链接]
发表于 2023-12-7 21:02:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼给的代码是这样的
matrix = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
   
row = len(matrix)
col = len(matrix[0])
   
min_row = [1024] * row
max_col = [0] * col
   
# 遍历矩阵中的每一个元素
# 找到每行中最小的元素,并将它们存放到列表min_row中
# 找到每列中最大的元素,并将它们存放到列表max_col中
for i in range(row):
    for j in range(col):
        min_row[i] = matrix[i][j] if matrix[i][j] < min_row[i] else min_row[i]    # min(matrix[i][j], min_row[i])
        max_col[j] = matrix[i][j] if matrix[i][j] > max_col[j] else max_col[j]    # max(matrix[i][j], max_col[j])
   
# 遍历矩阵中的每一个元素
# 判断是否同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”
for i in range(row):
    for j in range(col):
        if matrix[i][j] == min_row[i] and matrix[i][j] == max_col[j]:
            print(matrix[i][j])
我不理解的地方是这个两层循环体
我理解在第二层循环体中i的值是给到,知道第二层循环体结束循环i的值才会发生变化
所以我理解matrix[i][j]的循环中的值会出现 [0][0] [0][1] [0][2]  [1][0]  [1][1] [1][2]  [2][0] [2][1] [2][2]这样
用来找行的最小值我可以理解 但是我不理解怎么可以找到列的最大值呢   max_col[j] = matrix[i][j] if matrix[i][j] > max_col[j] else max_col[j]    # max(matrix[i][j], max_col[j]) 中的matrix[i][j]都是行的值  也就是找行的最大值
我自己想的是 再多写一层 但又不出来结果 实在想不出来了想请求大佬指导
matrix = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
   
row = len(matrix)
col = len(matrix[0])
   
min_row = [1024] * row
max_col = [0] * col
   
# 遍历矩阵中的每一个元素
# 找到每行中最小的元素,并将它们存放到列表min_row中
# 找到每列中最大的元素,并将它们存放到列表max_col中
for i in range(row):
    for j in range(col):
        min_row[i] = matrix[i][j] if matrix[i][j] < min_row[i] else min_row[i]
for x in range(col):
    for y in range(row):
        max_col[y] = matrix[y][x] if matrix[y][x] > max_col[y] else max_col[y]  
   
# 遍历矩阵中的每一个元素
# 判断是否同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”
for i in range(row):
    for j in range(col):
        if matrix[i][j] == min_row[i] and matrix[i][j] == max_col[j]:
            print(matrix[i][j])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-7 21:05:39 | 显示全部楼层
你好!对于这个问题,你的理解有一些问题。在这个两层循环体中,i和j的值会根据循环的次数变化。每次循环,i和j都会根据range()内的参数不断取不同的值。所以matrix中的值是会被遍历到的。

关于找到列的最大值的问题,你的想法是正确的。你可以通过再多写一层循环来找到列的最大值。但是你的代码中有一个问题:你在第二个循环体中再次使用了range(col),而应该是使用range(row)。因为你要遍历每一列,所以应该使用外层循环的行数作为迭代次数。

下面是修改后的代码:
matrix = [    [1, 2, 3],    [4, 5, 6],    [7, 8, 9]]row = len(matrix)col = len(matrix[0])min_row = [float('inf')] * rowmax_col = [float('-inf')] * col# 遍历矩阵中的每一个元素# 找到每行中最小的元素,并将它们存放到列表min_row中for i in range(row):    for j in range(col):        min_row[i] = min(matrix[i][j], min_row[i])# 找到每列中最大的元素,并将它们存放到列表max_col中for j in range(col):    for i in range(row):        max_col[j] = max(matrix[i][j], max_col[j])# 遍历矩阵中的每一个元素# 判断是否同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”for i in range(row):    for j in range(col):        if matrix[i][j] == min_row[i] and matrix[i][j] == max_col[j]:            print(matrix[i][j])
这样就可以正确找到同时满足“同一行的所有元素中最小”和“同一列的所有元素中最大”的元素了。希望能帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-7 21:25:59 | 显示全部楼层
本帖最后由 不二如是 于 2023-12-7 21:28 编辑

在找列的最大值时,你的循环中「i」和「j」的角色实际上是相反的。

在检查某个列的最大值时,「i」是变化的,因为它代表行的索引;

而j是固定的,因为它代表列的索引。

所以, 2023-12-07_21-27-54.png 实际上是在遍历同一列的不同行。

这就是为什么原始代码可以在同一双重循环中同时找到每行的最小值和每列的最大值。

让我们来逐步分析原始代码:

1. min_row和max_col数组初始化。min_row数组中的每个元素被设置为一个很大的数(这里是1024),因为我们将要寻找更小的数。max_col数组中的每个元素设置为0,因为我们将要寻找更大的数。

2. 第一个双重循环:
   - 外循环i从0到row-1,代表行的索引。
   - 内循环j从0到col-1,代表列的索引。
   - 在这个双重循环中,matrix[i][j]是当前行i的列j的元素。
   - 每次迭代,它会检查当前元素matrix[i][j]是否小于min_row[i](当前行的最小值);如果是,更新min_row[i]。
   - 同时,它也检查当前元素matrix[i][j]是否大于max_col[j](当前列的最大值);如果是,更新max_col[j]。

3. 第二个双重循环(检查鞍点):
   - 同样的外循环和内循环。
   - 在这个双重循环中,我们检查当前元素matrix[i][j]是否等于min_row[i](它所在行的最小值)并且是否等于max_col[j](它所在列的最大值)。
   - 如果都满足,那么matrix[i][j]就是一个鞍点,我们打印它出来。

在你的修改中,你尝试了添加一个额外的双重循环来计算列的最大值,但实际上并不需要,因为原始的代码已经足够计算每行的最小值和每列的最大值了。

让我们再次审视原始的代码段:
for i in range(row):
    for j in range(col):
        min_row[i] = min(matrix[i][j], min_row[i])
        max_col[j] = max(matrix[i][j], max_col[j])

这段代码对于每一行来说,i是固定的,j在变化;

对于每一列来说,j是固定的,i在变化。

所以,你可以在同一个内部循环中同时找到每行的最小值和每列的最大值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-7 22:18:02 | 显示全部楼层
不二如是 发表于 2023-12-7 21:25
在找列的最大值时,你的循环中「i」和「j」的角色实际上是相反的。

在检查某个列的最大值时,「i」是变 ...

这段代码对于每一行来说,i是固定的,j在变化;

对于每一列来说,j是固定的,i在变化。

对于这句话我可不可以理解原始代码可以同时做到 i 不变j 变 以及 j 不变 i 变
可是我理解按照 循环的结构 不应该是 i 不变 j 变 j迭代完后  回到开始的循环 i 变 j 再迭代 以此类推
为什么会出现j 固定 i 变的情况
难道是说 在内循环中 j 不变 i 在迭代吗
= -  = 这循环的结构我不是很理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表