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

如何用Python编写随机抽名脚本,直到某名字累计被选中3次后输出

随机抽取姓名功能Python实现优化

原有代码可优化点

  • 递归逻辑存在栈溢出风险:姓名录入、随机抽取两个环节都用递归实现,当录入姓名数量多、抽取轮次多时会触发Python递归深度限制,导致程序崩溃
  • 终止输入的判断覆盖不全:仅识别done和Done两种输入,无法匹配全大写DONE等其他大小写组合的终止指令
  • 计数逻辑效率低:每次抽取后都遍历整个结果列表统计姓名出现次数,抽取轮次越多性能损耗越大
  • 缺少边界校验:未处理用户未录入任何姓名直接输入done的场景,会导致后续随机抽取时报空列表错误

优化后实现代码

import random
from collections import defaultdict

def input_names():
    name_list = []
    while True:
        input_content = input("请输入女孩姓名,输入done结束录入:").strip()
        # 不区分大小写判断终止指令
        if input_content.lower() == "done":
            # 校验至少录入一个姓名
            if not name_list:
                print("未录入任何有效姓名,请先输入姓名后再结束")
                continue
            print("姓名录入完成")
            return name_list
        # 过滤空输入
        if input_content:
            name_list.append(input_content)

def draw_winner(name_list):
    count_map = defaultdict(int)
    while True:
        picked = random.choice(name_list)
        count_map[picked] += 1
        if count_map[picked] == 3:
            print(f"最终选中的姓名是:{picked}")
            return picked

if __name__ == "__main__":
    names = input_names()
    draw_winner(names)

功能说明

  • 录入环节:支持持续输入姓名,自动过滤空输入,任意大小写的done都可以触发录入终止,终止前自动校验至少有一个有效姓名
  • 抽取环节:用字典统计每个姓名的抽取次数,无需每次遍历历史抽取记录,性能更高;用循环替代递归,不会出现栈溢出问题,完全符合“某姓名累计出现3次即作为最终结果”的需求

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:54:03