如何精简处理Pandas列的Python函数compare_locality的if语句
精简compare_locality函数的方案
这代码重复得确实让人头疼,我来帮你把它精简一下,同时严格满足你提到的顺序判断逻辑——也就是按s0到s12的顺序检查,只有当前面所有的s都不为空时才会检查下一个,一旦遇到空的s就停止后续处理。
核心思路
原代码的问题在于手动重复了13次几乎完全一样的判断逻辑,我们可以通过将s和对应的loc配对成可迭代的集合,用循环来替代重复的if语句,这样既精简了代码,也让后续维护(比如新增s13)变得更简单。
优化后的代码
def compare_locality(p, p_loc, s0, s0_loc, s1, s1_loc, s2, s2_loc, s3, s3_loc, s4, s4_loc, s5, s5_loc, s6, s6_loc, s7, s7_loc, s8, s8_loc, s9, s9_loc, s10, s10_loc, s11, s11_loc, s12, s12_loc): loc = [] # 将s和对应的loc打包成元组列表,保持顺序 s_loc_pairs = [ (s0, s0_loc), (s1, s1_loc), (s2, s2_loc), (s3, s3_loc), (s4, s4_loc), (s5, s5_loc), (s6, s6_loc), (s7, s7_loc), (s8, s8_loc), (s9, s9_loc), (s10, s10_loc), (s11, s11_loc), (s12, s12_loc) ] for s, sloc in s_loc_pairs: if s == '': # 遇到空的s,立即停止后续检查(满足顺序判断逻辑) break loc.append(sloc) return compare(p_loc, *loc) if loc else ''
代码说明
- 配对处理:把每一组s和s_loc打包成元组,放入列表中,这样就能用循环统一处理所有的判断逻辑,避免重复代码。
- 顺序判断:循环过程中,一旦遇到某个s为空,就用
break终止循环,后面的s1到s12都不会再检查,完全符合你要求的“仅当前面所有s不为空才检查下一个”的逻辑。 - 简洁返回:用三元表达式替代原有的if-else判断,让返回逻辑更紧凑。
如果之后需要新增更多的s(比如s13和s13_loc),只需要在s_loc_pairs列表里添加对应的元组即可,不需要修改其他代码,扩展性比原代码好很多。
内容的提问来源于stack exchange,提问作者Avinash Clinton
相关产品推荐
相关产品推荐

