0

0

标题:修复事件选择功能中大小写不匹配导致的输入失效问题

花韻仙語

花韻仙語

发布时间:2026-01-12 12:24:02

|

623人浏览过

|

来源于php中文网

原创

标题:修复事件选择功能中大小写不匹配导致的输入失效问题

本文详解如何解决因 input().upper() 导致事件名称(如 "football")无法匹配字典键的逻辑错误,并提供健壮、大小写不敏感的事件识别方案。

在您提供的代码中,ChooseEvent → SportsEvents(以及 AcademicEvents)函数存在一个关键逻辑缺陷:用户输入的事件名被统一转为大写(event_name = event_name.upper()),但后续的条件判断却使用了原始大小写形式(如 event_name == "Football" 或 "F")。由于 "Football".upper() 结果是 "FOOTBALL",而字典中并不存在 "FOOTBALL" 这个键(只有 "Football" 和 "F"),因此所有非缩写形式的输入(如 "Football"、"football"、"FOOTBALL")均会跳过所有 if/elif 分支,最终触发 "Invalid sports event name." 错误。

? 问题根源分析

  • 字典 events 中定义的键是区分大小写的字符串:'Football'(首字母大写)、'F'(单字母)、'Maths Quiz' 等;
  • SportsEvents 函数中执行了 event_name = event_name.upper(),将任意输入强制转为全大写;
  • 后续 if event_name == "F" 可以匹配(因为 "F".upper() == "F"),但 event_name == "Football" 永远为 False(因为 "Football".upper() == "FOOTBALL" ≠ "Football");
  • 更严重的是,即使用户输入 "FOOTBALL",它也不在 events 字典中——字典里只有 'Football',没有 'FOOTBALL'。

✅ 正确解决方案:统一标准化 + 映射查找

不应依赖硬编码的字符串比较,而应设计大小写不敏感的事件解析逻辑。推荐以下两种专业做法:

✅ 方案一:构建标准化映射表(推荐)

在 menu() 函数初始化 events 字典后,立即构建一个规范化名称到标准事件名的映射字典

# 在 menu() 函数中 events 字典定义之后添加:
event_aliases = {}
for canonical_name in events:
    # 添加原名称(保留大小写)
    event_aliases[canonical_name.lower()] = canonical_name
    # 添加常见缩写(若已存在于 events 中,则自动覆盖;否则可手动补充)
    if len(canonical_name) > 1 and ' ' in canonical_name:
        # 生成首字母缩写,如 "Table Tennis" → "TT"
        initials = ''.join(word[0] for word in canonical_name.split()).upper()
        if initials in events:
            event_aliases[initials.lower()] = canonical_name
    # 显式添加已知缩写(确保大小写兼容)
    for alias in [canonical_name, canonical_name.upper(), canonical_name.lower()]:
        if alias in events:
            event_aliases[alias.lower()] = canonical_name

然后在 SportsEvents 和 AcademicEvents 中,统一使用该映射:

INFINITE ALBUM
INFINITE ALBUM

面向游戏玩家的生成式AI音乐

下载
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()

    # 标准化查找:全部转小写匹配映射表
    canonical_name = event_aliases.get(event_input.lower())

    if not canonical_name or events[canonical_name]['type'] != 'sports':
        print("Invalid sports event name.")
        return

    # ✅ 此时 canonical_name 是字典中真实存在的键(如 'Football' 或 'Table Tennis')
    if canonical_name == "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 canonical_name == "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 canonical_name == "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)
? 优势:完全解耦输入格式与业务逻辑;支持任意大小写、空格、缩写;易于扩展新别名;避免重复 if/elif 判断。

✅ 方案二:简化版(快速修复)

若暂不重构,可直接移除 .upper() 并改用 .lower() 统一处理,同时更新所有条件判断为小写形式:

# 修改 SportsEvents 开头:
event_name = input("...").strip()
# 删除这一行 ❌ event_name = event_name.upper()

# 所有条件改为小写比对:
if event_name.lower() in ["tt", "table tennis"]:
    # 处理 Table Tennis
elif event_name.lower() in ["f", "football"]:
    # 处理 Football
elif event_name.lower() in ["400r", "400m race"]:
    # 处理 400m Race
else:
    print("Invalid sports event name.")

⚠️ 注意:此方式需同步确保 events 字典键在逻辑中被正确引用(如 events['Football']),而非依赖输入字符串本身作为键。

? 其他关键注意事项

  • 字典键唯一性:当前 events 同时包含 'Football' 和 'F' 是合理的,但务必保证所有业务逻辑都通过标准化后的 canonical_name 访问数据,避免混用。
  • 输入健壮性:始终使用 .strip() 清除首尾空格,防止 "Football " 匹配失败。
  • 调试技巧:在关键分支前加入 print(f"Debug: event_input='{event_input}', canonical='{canonical_name}'") 快速定位匹配问题。
  • 未来扩展:建议将事件配置(含别名)抽离为 JSON/YAML 文件,实现配置驱动,提升可维护性。

通过以上任一方案,您的 "Football" 输入即可稳定触发对应逻辑,彻底解决大小写失配问题,让系统真正支持“用户友好型”事件输入体验。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 10万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号