如何在不区分值大小写的前提下比较Python字典且不修改原字典?
字典比对优化方案(name字段不区分大小写场景)
方案说明
你原有的复制字典后修改大小写比对的方案本身逻辑清晰、可读性强,没有功能问题,仅在字典体量较大时会产生不必要的内存开销。以下提供更节省资源、扩展性更强的实现方案,全程不会修改原字典内容:
方案1:固定字段特殊处理(适用于仅name需要忽略大小写的场景)
无需复制整个字典,直接分维度比对即可,性能最优:
def is_dict_match(d1: dict, d2: dict) -> bool: # 先校验两个字典的键集合完全一致 if d1.keys() != d2.keys(): return False # 单独校验name字段(不区分大小写) if d1["name"].casefold() != d2["name"].casefold(): return False # 校验其余字段完全相等 for key in d1: if key == "name": continue if d1[key] != d2[key]: return False return True # 调用示例 if is_dict_match(d1, d2): do_something_with_d1(d1)
方案2:可配置忽略大小写字段(适用于多字段需要忽略大小写的场景)
支持传入自定义的忽略大小写字段列表,扩展性更好:
def is_dict_match_ignore_case(d1: dict, d2: dict, ignore_case_keys: list = None) -> bool: ignore_case_keys = ignore_case_keys or [] # 先校验键集合一致 if d1.keys() != d2.keys(): return False for key in d1: v1, v2 = d1[key], d2[key] # 对配置的字符串字段做不区分大小写比对 if key in ignore_case_keys and isinstance(v1, str) and isinstance(v2, str): if v1.casefold() != v2.casefold(): return False # 其余字段正常比对 else: if v1 != v2: return False return True # 调用示例 if is_dict_match_ignore_case(d1, d2, ignore_case_keys=["name"]): do_something_with_d1(d1)
临时使用极简写法
如果只是单次临时使用,也可以用一行逻辑完成判断:
if (d1.keys() == d2.keys() and d1["name"].casefold() == d2["name"].casefold() and all(d1[k] == d2[k] for k in d1 if k != "name")): do_something_with_d1(d1)
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

