Python循环未向列表添加元素致Bingo卡片生成无输出求助
Bingo卡片生成代码问题排查与修复
我正在编写生成Bingo卡片的Python代码,要求每行包含5个数字,且每列数字分别属于1-9、10-19、20-29、30-39、40-49、50-59、60-69、70-79、80-90区间。但列表values始终没有元素被添加,导致无法进入后续循环。以下是我的代码:
def generate_nums(nums): #nums looks like this: [[],[],[]] - which is how it is inputed for i in range(0, len(nums)): while True: values = [] Min = 1 Max = 9 counter = 0 for j in range(0, len(nums[i])): value = random.randint(0, 1) values.append(value) if value == 1: counter += 1 if counter == 5: for item in values: if item == 1: nums[i].append(random.randint(Min, Max)) else: nums[i].append(" ") if Min == 1: Min = 10 else: Min += 10 if Max == 79: Max = 90 else: Max += 10 break #Function call if __name__ == "__main__": nums = [[],[],[]] print(generate_nums(nums))
问题根源
核心问题出在for j in range(0, len(nums[i]))这一行:初始调用时nums[i]是空列表,len(nums[i])等于0,导致这个循环完全不会执行,values始终为空,counter永远到不了5,外层的while True会无限循环。
另外原代码还存在两个隐患:
- 缺少
import random语句,运行时会直接报错。 Min和Max的更新逻辑虽然能工作,但可读性差,容易出错。
修复后的代码
import random def generate_nums(nums): # 遍历每一行 for i in range(len(nums)): while True: values = [] counter = 0 # 生成9个0/1值,对应9列,确保恰好5个1(即5个数字) for _ in range(9): value = random.randint(0, 1) values.append(value) if value == 1: counter += 1 # 找到符合5个数字的组合后,填充该行数据 if counter == 5: # 预定义每列的数字区间,清晰对应要求 column_ranges = [ (1, 9), (10, 19), (20, 29), (30, 39), (40, 49), (50, 59), (60, 69), (70, 79), (80, 90) ] for idx, item in enumerate(values): min_val, max_val = column_ranges[idx] if item == 1: nums[i].append(random.randint(min_val, max_val)) else: nums[i].append(" ") break return nums if __name__ == "__main__": nums = [[], [], []] bingo_card = generate_nums(nums) # 打印生成的Bingo卡片,每行对齐显示 for row in bingo_card: print(" | ".join(str(item).ljust(2) for item in row))
关键修改说明
- 将生成
values的循环改为range(9),确保每次生成9个元素(对应9个要求的数字区间)。 - 用
column_ranges列表预定义每列的数字范围,逻辑更直观,避免原代码中区间更新的潜在错误。 - 添加
import random语句,修复运行报错问题。 - 让函数返回处理后的卡片数据,调用时可以直接打印格式化后的结果,更符合Bingo卡片的展示需求。
- 优化打印逻辑,让每行元素对齐,可读性更强。
内容的提问来源于stack exchange,提问作者bbfav360
相关产品推荐
相关产品推荐

