Python中简化嵌套if语句及JSON题库优化方案咨询
问题解决方案
一、简化getq函数的方案
1. 链式过滤替代嵌套if
把每个过滤条件拆成独立逻辑,用数组filter方法链式调用,完全避免嵌套,可读性和扩展性更强。
假设你的选择题JSON结构大致如下:
{ "questions": [ { "id": 1, "subject": "数学", "difficulty": "中等", "keywords": ["代数", "方程"], "question": "求解方程2x+3=7的解", "options": ["A. 1", "B. 2", "C. 3", "D. 4"], "answer": "B" } ] }
以JavaScript为例,简化后的getq函数:
function getq(params = {}) { let filtered = [...questions]; // 复制原数组避免修改原始数据 // 按科目过滤 if (params.subject) { filtered = filtered.filter(q => q.subject === params.subject); } // 按难度过滤 if (params.difficulty) { filtered = filtered.filter(q => q.difficulty === params.difficulty); } // 按关键词过滤(匹配任意一个关键词即可) if (params.keywords?.length) { filtered = filtered.filter(q => params.keywords.some(k => q.keywords.includes(k))); } // 新增其他过滤条件只需追加新的filter分支 return filtered; }
2. 配置映射式过滤(适合多条件场景)
如果过滤条件很多,可以把每个条件的判断逻辑存入配置对象,循环处理参数,进一步简化核心代码:
// 定义所有过滤规则的映射表 const filterRules = { subject: (question, value) => question.subject === value, difficulty: (question, value) => question.difficulty === value, keywords: (question, values) => values.some(k => question.keywords.includes(k)) }; function getq(params = {}) { return questions.filter(question => { // 遍历传入的参数,逐一匹配过滤规则 return Object.entries(params).every(([key, value]) => { // 没有对应规则的参数默认通过过滤 return filterRules[key]?.(question, value) ?? true; }); }); }
新增过滤条件时,只需在filterRules里添加新的逻辑函数,不用修改getq的核心逻辑。
3. 效率优化建议
- 给高频过滤字段(如科目、难度)建立索引:加载JSON时提前生成索引对象,比如
{ "数学": [q1, q2], "语文": [q3] },按科目过滤时直接取对应数组,不用遍历全部数据。 - 大数据量场景下,改用生成器函数分批返回结果,避免一次性占用过多内存。
二、JSON存储是否合适?
对于编程新手来说,JSON是非常合适的入门选择:
- 优点:语法简单易读,所有主流编程语言都支持解析,无需额外安装数据库软件,文件可直接用文本编辑器修改。
- 局限性:如果题目数量超过几千条,或需要频繁修改、并发读写,JSON的性能会明显下降;没有内置查询语法,复杂过滤需自行实现;不支持事务、权限控制等高级功能。
如果只是个人/小团队使用、题目数量不多,JSON完全够用;后期数据量变大或需要更复杂操作时,再切换到SQLite这类轻量级数据库即可。
三、命令行编辑JSON的替代方案
新手不用硬啃命令行,推荐这些友好的工具:
- 可视化JSON编辑器:VS Code的JSON插件(带语法高亮、格式化、错误提示)、JSON Editor Online(本地网页版,无需联网),直接打开JSON文件就能可视化编辑,还能自动校验格式。
- 轻量级数据库工具:如果后期换成SQLite,用DB Browser for SQLite,完全可视化操作,不用写SQL命令,适合新手。
- 脚本批量修改:需要批量更新题目时(比如统一调整难度),写简单的Python/JavaScript脚本,读取JSON文件批量处理后保存,比手动修改效率高。
内容的提问来源于stack exchange,提问作者MachineNeil
相关产品推荐
相关产品推荐

