如何高效实现字典列表按Key分组聚合为字典?
优化字典列表的合并逻辑:更高效的实现方式
你的原代码逻辑是正确的,确实能完成需求,但可以通过Python内置工具让代码更简洁、效率更优,这里提供几种方案:
方案1:使用collections.defaultdict简化键存在性检查
defaultdict可以自动为不存在的键创建指定类型的默认值(这里是列表),省去手动判断的步骤,代码更简洁,执行效率也更优:
from collections import defaultdict input_dic = {"A":[{"a":11,"b":21,"c":31},{"a":12,"b":22,"d":24},{"a":18,"e":22,"d":24,"z":44}]} res_pp = {} for k, v in input_dic.items(): merged_dict = defaultdict(list) for d in v: for kk, vv in d.items(): merged_dict[kk].append(vv) res_pp[k] = dict(merged_dict) # 若需转为普通字典,可执行此步;直接用defaultdict也可满足多数场景
方案2:使用字典的setdefault方法(无需额外导入)
如果不想引入外部模块,setdefault方法可以一行完成“检查键是否存在+创建默认值+追加元素”的操作:
input_dic = {"A":[{"a":11,"b":21,"c":31},{"a":12,"b":22,"d":24},{"a":18,"e":22,"d":24,"z":44}]} res_pp = {} for k, v in input_dic.items(): merged_dict = {} for d in v: for kk, vv in d.items(): merged_dict.setdefault(kk, []).append(vv) res_pp[k] = merged_dict
对原代码的小优化
如果想保留原代码的结构,也可以把if kk in merged_dict.keys()改为if kk in merged_dict——字典的成员检查直接针对键,不需要调用keys()方法,能小幅提升执行效率。
总结
上述两种方案都比原代码更简洁易读,执行效率也与原代码相当甚至更优,其中defaultdict在处理大量数据时的表现略好,而setdefault则无需额外导入模块,适合轻量场景。
内容的提问来源于stack exchange,提问作者Ranchtti
相关产品推荐
相关产品推荐

