如何将嵌套字典对比的循环代码改写为列表推导式或更易读形式
问题解答
1. 列表推导式改写版本
你的现有逻辑可以直接改写为等价的列表推导式,写法如下:
L = [ v3["range"] for k, v in dict1.items() for k2, v2 in dict2.items() if k == k2 for k4, v4 in v.items() for k3, v3 in v2.items() if k4 == k3 ]
注意:原逻辑是严格匹配键的大小写,所以示例中dict1的小写color、blue和dict2的大写Color、Blue不会匹配到,仅能匹配到Texture下的actual、simulated两个键对应的range值。如果需要忽略大小写匹配,把判断条件改为k.lower() == k2.lower()、k4.lower() == k3.lower()即可。
2. 更易理解的优化实现
你原有代码嵌套了四层循环,需要全量遍历dict2的所有键,效率很低可读性也差,完全可以利用字典的O(1)键查找特性优化,优化后逻辑更直观,执行效率也更高:
L = [] for parent_key, child_dict in dict1.items(): # 直接判断父级键是否存在于dict2,无需遍历全量dict2 if parent_key not in dict2: continue dict2_parent_node = dict2[parent_key] for child_key in child_dict: # 直接判断子级键是否存在于dict2对应父节点下,无需遍历全量子节点 if child_key in dict2_parent_node: L.append(dict2_parent_node[child_key]["range"])
如果想要兼顾简洁性和可读性,也可以把优化后的逻辑改写为列表推导式:
L = [ dict2[parent_key][child_key]["range"] for parent_key, child_dict in dict1.items() if parent_key in dict2 for child_key in child_dict if child_key in dict2[parent_key] ]
内容的提问来源于stack exchange,提问作者heat9
相关产品推荐
相关产品推荐

