Python实现Plurality程序:如何输出得票最多的候选人?
修正Python版CS50 Plurality投票程序
问题分析
你的代码核心错误是max(vote_count.keys())——这是对候选人名字按字符串字典序取最大值,和得票数量完全无关,所以会输出错误结果。另外还有两个潜在问题:未处理无效选票、未支持并列胜者的情况。
修正后的代码
from collections import Counter candidates = ["Bob", "Steve", "Ross"] # 简化候选人列表打印 print(" ".join(candidates)) v = [] voters = int(input("\nNumber of voters: ")) for _ in range(voters): vote = input("Vote: ").strip().capitalize() # 只计入有效选票 if vote in candidates: v.append(vote) else: print(f"警告:'{vote}' 不是有效候选人,选票不计入") vote_count = Counter(v) print("\n得票统计:", vote_count) # 获取最高得票数,无有效票时默认0 max_vote_num = max(vote_count.values(), default=0) # 筛选出所有得票等于最高票数的候选人 winners = [name for name, count in vote_count.items() if count == max_vote_num] # 输出结果 if len(winners) == 1: print(f"\n胜者是:{winners[0]}") else: print(f"\n并列胜者:{'、'.join(winners)}")
关键修正点
- 正确计算最高得票:用
max(vote_count.values())获取真实最高票数,再匹配对应候选人,彻底解决原代码的逻辑错误。 - 处理无效选票:添加判断逻辑,仅当选票属于候选人列表时才计入,避免无效票干扰统计。
- 支持并列胜者:如果多个候选人得票相同且最高,会全部输出,符合投票程序的合理逻辑。
- 代码细节优化:用
" ".join(candidates)简化打印;用_代替未使用的循环变量;添加strip()去除输入前后空格,避免因空格导致的误判。
内容的提问来源于stack exchange,提问作者Mayo
相关产品推荐
相关产品推荐

