
本教程详解如何修复事件选择函数中因大小写转换导致的匹配失败问题,使用户既能输入“football”也能输入“f”成功触发对应逻辑。
在您提供的代码中,ChooseEvent → SportsEvents 函数存在一个关键逻辑缺陷:用户输入被强制转为大写(event_name = event_name.upper()),但后续却用原始拼写(如 "Football")进行字符串比较,导致永远无法匹配。
例如:
event_name = input("Enter the name of the sports event...") # 用户输入 "Football"
event_name = event_name.upper() # → 变成 "FOOTBALL"
# 后续判断:
if event_name == "F" or event_name == "Football": # ❌ "FOOTBALL" != "Football"显然,"FOOTBALL" 永远不等于 "Football"(首字母大写+其余小写),也不等于 "F"(除非用户真的只输 F)。这就是为什么输入 Football 总是跳转到错误提示,而 F 却能通过。
✅ 正确解决方案:统一标准化比对方式
推荐采用 字典键映射 + 标准化输入查找 的方式,既保持代码清晰,又彻底避免硬编码字符串比较的脆弱性。以下是优化后的 SportsEvents 函数核心逻辑(仅展示关键修改部分):
def SportsEvents(events, Teams, TeamNames, names):
event_input = input("Enter the name of the sports event (e.g., Table Tennis, Football, 400m Race or TT/F/400R): ").strip()
# 构建标准化映射:将所有合法输入(含大小写变体)映射到标准事件名
event_aliases = {
'TT': 'Table Tennis',
'TABLE TENNIS': 'Table Tennis',
'F': 'Football',
'FOOTBALL': 'Football',
'400R': '400m Race',
'400M RACE': '400m Race',
'400MR': '400m Race'
}
# 统一转为大写后查找(兼容用户任意大小写输入)
key = event_input.upper()
standard_event = event_aliases.get(key)
if not standard_event:
print("Invalid sports event name.")
return
# ✅ 确保 standard_event 是 events 字典中存在的键(注意:events 中已定义 'Football' 和 'F' 等键)
if standard_event not in events or events[standard_event]['type'] != 'sports':
print("Event not found or not a sports event.")
return
# ✅ 后续逻辑全部基于 standard_event(如 'Football')操作,无需重复判断
if standard_event == 'Table Tennis':
participant_name = input("Enter participant name: ")
if participant_name not in names:
print("Participant not found.")
return
team_name = input("Enter team name (optional): ").strip()
if team_name and team_name in TeamNames:
events['Table Tennis']['participants'].append(team_name)
else:
events['Table Tennis']['participants'].append(participant_name)
elif standard_event == 'Football':
team_name = input("Enter the name of the team: ").strip()
if team_name in TeamNames:
events['Football']['participants'].append(team_name)
else:
print("Invalid team name.")
elif standard_event == '400m Race':
participant_name = input("Enter participant name: ")
if participant_name not in names:
print("Participant not found.")
return
team_name = input("Enter team name (optional): ").strip()
if team_name and team_name in TeamNames:
events['400m Race']['participants'].append(team_name)
else:
events['400m Race']['participants'].append(participant_name)? 关键改进点总结
- 剥离大小写敏感性:使用 .upper() 统一输入格式,再查表,而非混合大小写硬比较;
- 集中维护别名映射:新增缩写或别名只需修改 event_aliases 字典,无需改动多处 if/elif;
- 语义清晰、可扩展性强:未来添加新事件(如 "Basketball" / "B")只需扩写字典,逻辑不变;
- 防御性检查:先查映射,再校验是否真实存在于 events 字典中,避免 KeyError 或类型误判。
⚠️ 注意:原 events 字典中同时存在 'Football' 和 'F' 两个键,虽可运行,但易引发冗余和维护混乱。建议精简为仅保留标准名称(如 'Football'),缩写通过映射指向它——这样 events 结构更语义化,也便于后续统计、导出等操作。
通过以上重构,您的程序将真正实现“输入 football、FOOTBALL、F 或 f 均可正确识别为足球赛事”,大幅提升用户体验与代码健壮性。










