【小甲鱼编程题】创建二维列表与寻找幸运数

在这里插入图片描述

1.创建一个88 x 88的随机整数矩阵,然后匹配用户输入的整数是否与其中某元素相等,如果相等则打印其行号和列号。

要求1:随机整数取值范围0~1024
要求2:需找出所有匹配的元素
程序实现演示:
在这里插入图片描述

  • 这个主要考察的是创建二维列表,随机整数调用random模块。我想的创建二维列表的方法是先创建一个88 x 88 的全元素为0的二维列表,在遍历这个列表的过程中一个一个重新赋值随机数并判断他是不是等于待匹配的整数。需要注意的是用户输入的数据类型默认是字符串,在判断语句中比较的时候需要转换成整型。
import random
a = int(input("请输入一个待匹配的整数:"))

matrix = [0] * 88
for i in range(88):
    matrix[i] = [0] * 88

for x in range(88):
    for y in range(88):
        matrix[x][y] = random.randint(0,1024)
        if matrix[x][y] != a:
            continue
        else:
            print(x,y,sep = " ")

在这里插入图片描述

  • 标准答案:
    标准答案的思路是先创建一个一维空列表,然后往这个空列表里添加随机数,循环题目要求的次数就可以成功创建一个二维列表。最后再遍历列表是否存在目标值。
import random
    
# 创建并初始化二维列表
matrix = []
for i in range(88):
    matrix.append([])
    for j in range(88):
        matrix[i].append(random.randint(0, 1024))
    
target = int(input("请输入一个代匹配的整数:"))
    
# 匹配用户输入的整数
for i in range(88):
    for j in range(88):
        if matrix[i][j] == target:
            print(i, j)

2.找出矩阵中的幸运数字。

说明:假设给定一个m * n的矩阵(矩阵中数值的取值范围是0~1024,且各不相同),如果某一元素的值在同一行的所有元素中最小,并且在同一列的所有元素中最大,那么该元素就是幸运数字。
假设给定的矩阵如下,那么输出结果应该是66(同时满足同一行的所有元素中最小,同一列的所有元素中最大):

matrix = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
  • 我的思路是创建两个临时列表分别储存该矩阵每一行的最大值和每一列的最小值,然后看两列表中是否存在相同元素,如果存在那就说明这个元素既满足行最小又满足列最大,那他必然就是幸运数字。
  • 行最小好找,用sort()函数升序排列,第一个就是最小的,这里需要注意排完序之后原矩阵中元素的顺序也会改变。由于原矩阵在找行最小的过程中元素顺序已经改变,所以我们最开始相同的矩阵定义给了两个变量。还有有一个难点在于列最大怎么确定,我的想法是将所给矩阵转置,那么要找列最大就转换成了找转置矩阵行最大的问题,用reverse()函数降序排列,第一个元素就是最大的。当然了由于这道题给定了三阶矩阵所以转置部分的代码没有问题,但是如果遇到四阶甚至更高阶那么转置这块的代码就行不通了。
matrix1 = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
matrix2 = [[10, 36, 52],
          [33, 24, 88],
          [66, 76, 99]]
temp1 = []
temp2 = []


for i in matrix1:
    i.sort()        #此时matrix1的元素位置已经改变,为了后续转置的是原矩阵所以前面有一个相同的matrix2
    temp1.append(i[0])
print(temp1)


for x in range(0,2):
    for y in range(1,3):
        (matrix2[x][y], matrix2[y][x]) = (matrix2[y][x], matrix2[x][y])
for j in matrix2:
    j.reverse()
    temp2.append(j[0])
print(temp2)

for x in temp1:
    for y in temp2:
        if x == y:
            print("幸运数字是:", x)
            break  

在这里插入图片描述
当然这个代码还存在一个问题就是不知道幸运数字的下标,也就是不知道它在原矩阵中的位置。这个问题在标准答案中得到了解决。

  • 标准答案:
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] = min(matrix[i][j], min_row[i])
        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, j)

在这里插入图片描述

标准答案显然就更具有普遍性,他在找最大最小元素时用到了min()函数和max()函数,就更方便了。并且在判断是否存在幸运数字时直接根据条件从原列表中找,这样就避免了只知道幸运数字存在而不知道位置的问题了。

3.min()函数与max()函数

  • min()函数用于获取一个可迭代对象或者多个参数中的最小值。
    如果只提供一个参数,那他应该是一个可迭代对象,返回该对象中的最小值;
    如果提供两个或者多个参数,那么返回值是参数中的最小值;
    如果存在多个最小值,该函数将返回第一个找到的最小值;
    传入字符串的话,比较的是每个字符的Unicode编码值;
    有两个可选的关键字实参,key参数指定一个用于比较的函数(类似列表的sort()方法),default参数是指定当可迭代对象为空时返回的值,如果可迭代对象为空并且没有提供default参数,则会抛出valueerror的异常。
    在这里插入图片描述
  • max()函数与min()函数用法一直,只不过它获取的是一个可迭代对象或者多个参数中的最大值。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值