You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会无限循环。

另外原代码还存在两个隐患:

  1. 缺少import random语句,运行时会直接报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:54:14