如何优雅改写嵌套if/elif/else循环?能否使用列表推导式?
嵌套条件判断的优化方案
先梳理原代码的问题
原代码存在多处逻辑无效和格式问题:
- 当
i == 'categorical'时,内部嵌套的i == 'numerical'判断永远无法成立,对应代码块完全不会执行 depgroupl中没有'time to event'元素,相关分支判断无效indepgroupl中没有'factors'元素,elif i == 'factors'的分支也永远不会触发- 缩进混乱,部分代码块层级错误
优雅实现:用字典映射替代嵌套if
把「自变量类型-因变量类型」的对应规则用字典存储,直接通过键值对匹配输出内容,彻底避免嵌套判断的混乱。
修正逻辑后的代码实现
先明确合理的映射规则(修正原代码的笔误和遗漏),再实现:
# 定义所有类型组合对应的输出字符串 type_mapping = { ('numerical', 'numerical'): 'utter_indepnumcat_depnum', ('numerical', 'categorical'): 'utter_indepnumcat_depcat', ('numerical', 'time to event'): 'utter_indepnumcat_deptimetoevent', ('categorical', 'numerical'): 'utter_indep2cat_depnum', ('factors', 'count'): 'utter_indepfac_depcount', ('factors', 'numerical'): 'utter_indepfac_depnum' } # 修正后的自变量、因变量列表 indep_types = ['numerical', 'categorical', 'factors'] dep_types = ["numerical", "categorical", "count", "time to event"] # 遍历所有组合,匹配规则输出 for indep in indep_types: for dep in dep_types: result = type_mapping.get((indep, dep)) if result: print(result)
这种方式的优势:
- 规则集中管理,修改或扩展新组合时只需在字典中添加键值对
- 代码结构清晰,可读性远高于嵌套条件判断
- 避免了冗余的逻辑判断,执行效率更高
关于列表推导式的可行性
列表推导式的设计目的是生成数据列表,而非执行打印这类带副作用的操作。如果一定要用,可以先通过列表推导式收集所有需要打印的字符串,再遍历打印:
# 用列表推导式收集符合规则的输出字符串 output_list = [ type_mapping[(indep, dep)] for indep in indep_types for dep in dep_types if (indep, dep) in type_mapping ] # 遍历打印 for item in output_list: print(item)
强行用列表推导式直接执行打印并不合适,会降低代码可读性,不推荐使用。
内容的提问来源于stack exchange,提问作者karan
相关产品推荐
相关产品推荐

