如何简洁编写基于exactSearch变量的两种匹配条件逻辑?
问题描述
已知exactSearch为布尔变量:
- 取值
True时,使用==执行精确匹配 - 取值
False时,使用in执行模糊匹配
匹配成功则向DataFrame追加数据,失败则继续循环。现有代码可正常运行,但希望简化重复的条件判断逻辑:
if exactSearch: if payerName == payer: # 查找精确匹配 result.loc[len(result)] = [provider,payer] + status.split(" ") # 找到则添加至结果 else: continue else: if payerName in payer: # 查找模糊匹配 result.loc[len(result)] = [provider,payer] + status.split(" ") # 找到则添加至结果 else: continue
简化方案
可以通过抽离匹配条件、合并分支逻辑的方式简化代码,同时保留原逻辑的完整性:
方式一:抽离匹配判断,统一业务逻辑
先根据exactSearch的取值确定是否匹配,再执行后续操作,避免重复编写追加数据的代码:
# 先判断当前是否符合匹配规则 is_match = (payerName == payer) if exactSearch else (payerName in payer) if is_match: result.loc[len(result)] = [provider,payer] + status.split(" ") else: continue
这种写法把重复的分支逻辑合并,仅保留一次业务处理代码,结构更清晰,也降低了维护成本。
方式二:紧凑的单条件判断
直接在if语句中用三元表达式处理匹配规则,代码更简洁紧凑:
if (payerName == payer) if exactSearch else (payerName in payer): result.loc[len(result)] = [provider,payer] + status.split(" ") else: continue
适合逻辑简单的场景,一眼就能明确匹配规则和对应的操作。
额外优化建议
result.loc[len(result)]这种逐行追加的方式在数据量较大时效率较低,建议先将符合条件的数据存入列表,最后一次性合并到DataFrame:
# 初始化临时列表存储结果数据 temp_results = [] # 循环内逻辑 is_match = (payerName == payer) if exactSearch else (payerName in payer) if is_match: temp_results.append([provider,payer] + status.split(" ")) # 循环结束后批量合并 if temp_results: result = pd.concat([result, pd.DataFrame(temp_results, columns=result.columns)], ignore_index=True)
这种批量操作能避免频繁修改DataFrame带来的性能损耗。
内容的提问来源于stack exchange,提问作者Buracku
相关产品推荐
相关产品推荐

