鱼C论坛

 找回密码
 立即注册
查看: 59|回复: 6

[已解决]python最新版 023列表 课后作业------”输出幸运数“一题的疑惑

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

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

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

x
python最新版 023列表 课后作业------”输出幸运数“一题的疑惑

  1. nei=[]
  2. wai=[]
  3. i=0
  4. s=0
  5. import random
  6. while s<22:
  7.     while i<22:        
  8.         m=random.randint(0,483)#生成随机数
  9.         for row in wai:               
  10.             while m in row:
  11.                 m=random.randint(0,483)#检验随机数是否重复,若重复则重新生成   
  12.         nei.append(m)#将新数加入nei列表
  13.         i+=1#计数器加一,进行下一轮循环,一共进行22次
  14.     wai.append(nei)#将拥有22个元素的列表nei添加为列表wai的一个元素
  15.     nei=[]#清空列表nei,准备生成下一个nei
  16.     s+=1#计数器加一
  17. #至此,理想状态下应生成好了22*22的矩阵,即列表wai,接下来要开始寻找幸运数
  18. new1=[]
  19. new2=[]
  20. for t in range(0,22):
  21.     mini=min(wai[t])#找到一行的最小值
  22.     new1.append(mini)#将每行的最小值添加到new1/储存最小值
  23. for p in range(0,22):
  24.     for q in range(0,22):
  25.         lie.append(wai[q][p])#将每列生成为一个列表
  26.     maxi=max(lie)#找到一列的最大值
  27.     new2.append(maxi)#将每列的最大值添加到new2/储存最大值
  28.     lie=[]#情况列表lie,准备储存下一列
  29. for h in new1:
  30.     if h in new2:
  31.         print(h)

复制代码



目前已知存在的问题是wai列表里混入了空列表,并没有按预期储存22个nei列表,原因在哪里??(可能也存在其他问题)(代码比较繁琐,欢迎指正)

题目在此

题目在此
最佳答案
6 天前
i = 0 只在最开头初始化一次!
第一轮s=0:内层while i<22循环跑完,i变成22,退出内层 while。把nei加入 wai,清空nei,s变成1。
第二轮s=1进来:i 依旧是 22,while i<22条件直接不成立,内层循环一次都不执行。
直接执行wai.append(nei),此时nei是空列表 → 往 wai 塞空列表!
后面每一轮 s 循环,i 永远 = 22,不断追加空列表,wai 就变成 [22元素列表, [], [], [], …]。
每生成一行之前,把 i 重置回 0。把i=0放到外层 while 循环内部。
import random

nei=[]
wai=[]
s=0
while s<22:
    i = 0   # 关键:每新生成一行,i重置为0
    while i<22:        
        m=random.randint(0,483)
        # 检查:不能和已经生成好的行重复
        repeat = False
        for row in wai:               
            if m in row:
                repeat = True
                break
        # 额外检查:当前正在构建的nei本行内也不能重复
        if m in nei:
            repeat = True
        if not repeat:
            nei.append(m)
            i+=1
    wai.append(nei)
    nei=[]
    s+=1

# 找幸运数字
new1=[]   # 存每行最小值
for t in range(0,22):
    mini=min(wai[t])
    new1.append(mini)

new2=[]   # 存每列最大值
for p in range(0,22):
    lie=[]   # 初始化lie
    for q in range(0,22):
        lie.append(wai[q][p])
    maxi=max(lie)
    new2.append(maxi)

# 不能简单 h in new2;要校验坐标!
lucky_nums = []
for row_idx in range(22):
    row_min_val = new1[row_idx]
    # 找到这一行最小值在哪一列
    col_idx = wai[row_idx].index(row_min_val)
    # 拿该位置,看它是不是本列的最大值
    if wai[row_idx][col_idx] == new2[col_idx]:
        lucky_nums.append(wai[row_idx][col_idx])

print("幸运数字:", lucky_nums)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
同学你的代码不完整,我猜测你是在做“随机生成列表并筛选幸运数”的题目。下面给出一个简单例子(假设幸运数是能被3整除的数字):


  1. import random

  2. nums = []  # 空列表,用来存放随机数
  3. for i in range(10):
  4.     nums.append(random.randint(1, 100))

  5. print("所有随机数:", nums)

  6. lucky = []
  7. for num in nums:
  8.     if num % 3 == 0:
  9.         lucky.append(num)

  10. print("幸运数:", lucky)
复制代码


如果题目要求“幸运数”是别的规则,比如数字包含7,只需修改判断条件:


  1. if num % 3 == 0:      # 能被3整除
  2. if num % 7 == 0:      # 能被7整除
  3. if '7' in str(num):   # 数字中包含7
复制代码


你的代码问题排查:

  • nei=wai=要赋初始值,否则语法错误。
  • while s后面没有循环体,且s=0表示条件为假,循环不会执行;如果改成while True就得在循环里用break退出。
  • import random应该放在文件开头。


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层    本楼为最佳答案   
i = 0 只在最开头初始化一次!
第一轮s=0:内层while i<22循环跑完,i变成22,退出内层 while。把nei加入 wai,清空nei,s变成1。
第二轮s=1进来:i 依旧是 22,while i<22条件直接不成立,内层循环一次都不执行。
直接执行wai.append(nei),此时nei是空列表 → 往 wai 塞空列表!
后面每一轮 s 循环,i 永远 = 22,不断追加空列表,wai 就变成 [22元素列表, [], [], [], …]。
每生成一行之前,把 i 重置回 0。把i=0放到外层 while 循环内部。
import random

nei=[]
wai=[]
s=0
while s<22:
    i = 0   # 关键:每新生成一行,i重置为0
    while i<22:        
        m=random.randint(0,483)
        # 检查:不能和已经生成好的行重复
        repeat = False
        for row in wai:               
            if m in row:
                repeat = True
                break
        # 额外检查:当前正在构建的nei本行内也不能重复
        if m in nei:
            repeat = True
        if not repeat:
            nei.append(m)
            i+=1
    wai.append(nei)
    nei=[]
    s+=1

# 找幸运数字
new1=[]   # 存每行最小值
for t in range(0,22):
    mini=min(wai[t])
    new1.append(mini)

new2=[]   # 存每列最大值
for p in range(0,22):
    lie=[]   # 初始化lie
    for q in range(0,22):
        lie.append(wai[q][p])
    maxi=max(lie)
    new2.append(maxi)

# 不能简单 h in new2;要校验坐标!
lucky_nums = []
for row_idx in range(22):
    row_min_val = new1[row_idx]
    # 找到这一行最小值在哪一列
    col_idx = wai[row_idx].index(row_min_val)
    # 拿该位置,看它是不是本列的最大值
    if wai[row_idx][col_idx] == new2[col_idx]:
        lucky_nums.append(wai[row_idx][col_idx])

print("幸运数字:", lucky_nums)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 6 天前 | 显示全部楼层
  1. while s < 22:
  2.         while i < 22:
  3.                 m = random.randint(0, 483)  # 生成随机数
  4.                 for row in wai:
  5.                         while m in row:
  6.                                 m = random.randint(
  7.                                         0, 483
  8.                                 )  # 检验随机数是否重复,若重复则重新生成
  9.                 nei.append(m)  # 将新数加入nei列表
  10.                 i += 1  # 计数器加一,进行下一轮循环,一共进行22次
  11.         wai.append(nei)  # 将拥有22个元素的列表nei添加为列表wai的一个元素
  12.         nei = []  # 清空列表nei,准备生成下一个nei
  13.         s += 1
  14.         i = 0
复制代码

看到最后一行, 你在内层循环结束后没有把 i 初始化为 0, 导致后面 i 一直是 22, 根本进不了内层循环了. 建议使用 for 循环更方便一些.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
王星云 发表于 2026-8-14 22:46
i = 0 只在最开头初始化一次!
第一轮s=0:内层while i

你好 我修改了我的代码
import random
nei=[]
wai=[]
i=0
s=0
while s<22:
    i=0
    while i<22:        
        m=random.randint(0,483)#生成随机数
        repeat=False
        for row in wai:               
            if m in row:
                repeat=True
                break
        if m in nei:
           repeat=True #检验随机数是否重复,若重复则重新生成
        if repeat==False:
            nei.append(m)#将新数加入nei列表
            i+=1#计数器加一,进行下一轮循环,一共进行22次
    wai.append(nei)#将拥有22个元素的列表nei添加为列表wai的一个元素
    nei=[]#清空列表nei,准备生成下一个nei
    s+=1#计数器加一

#至此,理想状态下应生成好了22*22的矩阵,即列表wai,接下来要开始寻找幸运数
new1=[]
new2=[]
lie=[]
for t in range(0,22):
    mini=min(wai[t])#找到一行的最小值
    new1.append(mini)#将每行的最小值添加到new1/储存最小值
for p in range(0,22):
    for q in range(0,22):
        lie.append(wai[q][p])#将每列生成为一个列表
    maxi=max(lie)#找到一列的最大值
    new2.append(maxi)#将每列的最大值添加到new2/储存最大值
    lie=[]#情况列表lie,准备储存下一列


lucky=[]




for x in range(0,22):
    zxz=new1[x]#依次取出最小值
    idx=wai[x].index(zxz)#查找该最小值所在的列
    if new2[idx]==zxz:
        lucky.append(zxz)
print(lucky)


但是返回结果依旧为空列表,应该不是纯粹的概率问题,难道代码还有问题?希望可以继续交流~~(我试了你的代码,也是返回空列表)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
FishC 发表于 2026-8-14 16:36
同学你的代码不完整,我猜测你是在做“随机生成列表并筛选幸运数”的题目。下面给出一个简单例子(假设幸运 ...

import random
nei=[]
wai=[]
i=0
s=0
while s<22:
    i=0
    while i<22:        
        m=random.randint(0,483)#生成随机数
        repeat=False
        for row in wai:               
            if m in row:
                repeat=True
                break
        if m in nei:
           repeat=True #检验随机数是否重复,若重复则重新生成
        if repeat==False:
            nei.append(m)#将新数加入nei列表
            i+=1#计数器加一,进行下一轮循环,一共进行22次
    wai.append(nei)#将拥有22个元素的列表nei添加为列表wai的一个元素
    nei=[]#清空列表nei,准备生成下一个nei
    s+=1#计数器加一

#至此,理想状态下应生成好了22*22的矩阵,即列表wai,接下来要开始寻找幸运数
new1=[]
new2=[]
lie=[]
for t in range(0,22):
    mini=min(wai[t])#找到一行的最小值
    new1.append(mini)#将每行的最小值添加到new1/储存最小值
for p in range(0,22):
    for q in range(0,22):
        lie.append(wai[q][p])#将每列生成为一个列表
    maxi=max(lie)#找到一列的最大值
    new2.append(maxi)#将每列的最大值添加到new2/储存最大值
    lie=[]#情况列表lie,准备储存下一列


lucky=[]




for x in range(0,22):
    zxz=new1[x]#依次取出最小值
    idx=wai[x].index(zxz)#查找该最小值所在的列
    if new2[idx]==zxz:
        lucky.append(zxz)
print(lucky)


你好,结果只能返回空列表,代码还是有问题吗??希望继续交流~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
潜水的老鼠 发表于 2026-08-15 20:23
FishC 发表于 2026-8-14 16:36
同学你的代码不完整, ...


同学,你贴出的代码有几个问题,我们先逐个解决:

  • nei= 和 wai= 后面没有赋值,这样会直接报语法错误。你可以先给它们赋一个初始值,比如 nei = 0wai = 0
  • while s 这一行,因为前面写了 s=0,而 0 代表假,所以循环根本不会执行。
  • import random 最好放在整个程序的最开头,不要写在中间。


如果你想实现的是“随机生成一堆数字,然后把其中符合幸运数规则的挑出来”,可以参考下面的完整写法:


  1. import random

  2. # 生成10个1~100的随机数
  3. nums = []
  4. for i in range(10):
  5.     nums.append(random.randint(1, 100))

  6. print("所有随机数:", nums)

  7. # 筛选幸运数,这里假设能被3整除的就是幸运数
  8. lucky = []
  9. for num in nums:
  10.     if num % 3 == 0:
  11.         lucky.append(num)

  12. print("幸运数:", lucky)
复制代码


如果你们的题目里“幸运数”有别的规则,比如“数字中包含7”或者“能被7整除”,那你只需要修改 if 那一行即可,例如:


  1. if num % 7 == 0:          # 能被7整除
  2. if '7' in str(num):       # 数字中包含7
复制代码


你现在的代码里还有 nei 和 wai,可能是有其他要求,比如“内层循环”和“外层循环”?如果是这样,请你把完整的题目内容贴出来,我再给你更准确的解释。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-20 23:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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