Python:基于指定键合并扁平化字典列表,以列表2内容优先
优化字典列表合并方案
问题描述
我有两个结构相同的字典列表,需要将它们扁平化合并为一个字典,规则如下:
- 以第二个列表(
product_mapping)的内容为优先(键重复时,用第二个列表的值覆盖第一个) - 用原字典中
RealField的值作为新字典的键,SuppliedField的值作为对应值
现有代码可运行,但希望用更简洁的推导式实现,求更优方案。
现有实现代码
import operator default = [ {"RealField": "SourceIP", "SuppliedField": "src"}, {"RealField": "DestinationIP", "SuppliedField": "dst"}, {"RealField": "Direction", "SuppliedField": "dir"} ] product_mapping = [ {"RealField": "SourceIP", "SuppliedField": "src2"}, {"RealField": "DestinationIP", "SuppliedField": "dst2"}, {"RealField": "NEW", "SuppliedField": "newvalue"}, ] def dictionary_from_mappings(default_mapping, product_mapping): default = [{i["RealField"]:i["SuppliedField"]} for i in default_mapping] default_flat = reduce(operator.ior, default, {}) product = [{i["RealField"]:i["SuppliedField"]} for i in product_mapping] product_flat = reduce(operator.ior, product, {}) return default_flat | product_flat mappings = dictionary_from_mappings(default, product_mapping) print(mappings)
运行输出:
{'SourceIP': 'src2', 'DestinationIP': 'dst2', 'Direction': 'dir', 'NEW': 'newvalue' }
更优实现方案
可以直接用字典推导式生成完整字典,再利用字典合并操作符|完成合并,无需借助reduce和operator.ior,代码更简洁直观:
default = [ {"RealField": "SourceIP", "SuppliedField": "src"}, {"RealField": "DestinationIP", "SuppliedField": "dst"}, {"RealField": "Direction", "SuppliedField": "dir"} ] product_mapping = [ {"RealField": "SourceIP", "SuppliedField": "src2"}, {"RealField": "DestinationIP", "SuppliedField": "dst2"}, {"RealField": "NEW", "SuppliedField": "newvalue"}, ] def dictionary_from_mappings(default_mapping, product_mapping): # 一步生成完整字典,省去拆分小字典再合并的冗余步骤 default_dict = {item["RealField"]: item["SuppliedField"] for item in default_mapping} product_dict = {item["RealField"]: item["SuppliedField"] for item in product_mapping} # 合并时product_dict的键自动覆盖default_dict的同名键,符合优先级要求 return default_dict | product_dict mappings = dictionary_from_mappings(default, product_mapping) print(mappings)
优化点说明
- 简化流程:直接从列表生成完整字典,避免了先创建单键小字典再合并的多余步骤
- 可读性提升:逻辑清晰直观,无需额外理解
reduce和ior的作用 - 性能优化:减少多次字典合并操作,直接生成目标字典后一次合并,效率更高
如果追求极致简洁,也可以将函数写成一行(可读性略有下降):
def dictionary_from_mappings(default_mapping, product_mapping): return {i["RealField"]: i["SuppliedField"] for i in default_mapping} | {i["RealField"]: i["SuppliedField"] for i in product_mapping}
内容的提问来源于stack exchange,提问作者Neil Walker
相关产品推荐
相关产品推荐

