如何用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
相关产品推荐
相关产品推荐

