如何通过两个字符串参数对字典进行多条件过滤?
现有实现的问题分析
- 命名冲突:你定义的函数名
name、severity和Click传入的参数名完全重名,函数内部判断not name时会优先识别为函数对象而非传入的参数值,判断逻辑永久失效。 - 逻辑覆盖不全:拆分的三个独立函数没有处理两个参数同时传入的联合校验场景,无法满足同时匹配两个条件的需求。
- 冗余循环:不需要遍历子字典的所有键值对找目标字段,直接用字典
get方法取对应字段即可,多余的嵌套循环会降低代码效率、增加出错概率。
可行解决方案
首先补充Click参数定义,再替换核心过滤逻辑即可:
import click # Click参数定义,未传参数时默认值为None @click.command() @click.option('--name', help='按主机名过滤,不传则不校验该条件') @click.option('--severity', help='按Severity过滤,不传则不校验该条件') def main(name, severity): # 此处替换为你实际的hostname_list数据源 hostname_list = {"sap_landscape": {}} # 核心过滤逻辑 for _, server_info in hostname_list['sap_landscape'].items(): current_host = server_info.get("hostname") current_sev = server_info.get("Severity") match_flag = True # 仅当用户传入name参数时才校验主机名匹配 if name is not None and current_host != name: match_flag = False # 仅当用户传入severity参数时才校验Severity匹配 if severity is not None and current_sev != severity: match_flag = False if match_flag: print(server_info) if __name__ == "__main__": main()
实现原理说明
- 自动适配三种过滤场景:每个参数的校验逻辑独立,只有用户传入了对应参数才会触发校验,未传则跳过该条件,天然支持仅按name过滤、仅按severity过滤、双参数联合过滤三种需求,不需要写多分支判断不同参数组合。
- 无命名冲突风险:没有额外定义和参数重名的函数,判断逻辑不会出现歧义。
- 代码简洁高效:直接取字典目标字段做判断,省去了嵌套循环遍历的开销。
内容的提问来源于stack exchange,提问作者Fex
相关产品推荐
相关产品推荐

