Python如何从结构各异的字典大列表拆分多个同键结构子列表
问题描述
现有一个存储了100万条元素的大型字典列表,列表内的字典结构不统一,无法提前获知所有字典的具体键构成。
示例原始数据如下:
mylist = [{'name': 'Juan Carlos','age':38},{'name':'David','country':'Brazil'}, {'name':'Agustina', 'country': 'Argentina'},{'name':'Renzo','age':24}]
需求为将上述列表拆分为多个独立子列表,每个子列表内的所有字典必须拥有完全一致的键集合,且要适配动态分组场景:无需提前确定最终拆分生成的子列表总数量。
预期拆分效果如下:
list1 = [{'name': 'Juan Carlos','age':38},{'name':'Renzo','age':24}] list2 = [{'name':'David','country':'Brazil'},{'name':'Agustina', 'country': 'Argentina'}]
实现方法
核心逻辑是用哈希表做动态分组,将每个字典的键集合生成唯一的可哈希标识作为分组键,相同键结构的字典自动归入同一分组,全程只需要遍历一次原列表,时间复杂度O(n),可以高效处理百万级数据。
from collections import defaultdict def group_by_same_keys(input_list): group_map = defaultdict(list) for d in input_list: # 对键排序后转元组作为唯一标识:避免键写入顺序不同、但键集合完全一致的字典被误分到不同组 # 如果业务要求键的顺序也必须完全一致,去掉sorted即可,直接写 tuple(d.keys()) key_flag = tuple(sorted(d.keys())) group_map[key_flag].append(d) # 返回所有分组组成的列表,按实际生成的分组数量动态返回,不需要提前定义变量 return list(group_map.values()) # 调用测试 mylist = [{'name': 'Juan Carlos','age':38},{'name':'David','country':'Brazil'}, {'name':'Agustina', 'country': 'Argentina'},{'name':'Renzo','age':24}] group_result = group_by_same_keys(mylist)
调用后的返回值说明:
group_result[0]就是所有键为name、age的字典组成的子列表,和预期的list1一致group_result[1]就是所有键为name、country的字典组成的子列表,和预期的list2一致- 如果原数据里有N种不同的键集合组合,返回的列表就会自动包含N个子列表,不需要提前预知分组数量
注意事项
- 处理百万级数据时,该方案内存占用和遍历效率都满足生产环境要求,不需要额外依赖第三方库
- 键排序的逻辑可以根据业务需求调整:如果业务认定只要键的集合完全相同就算同结构,保留
sorted即可;如果要求键的存储顺序也必须完全匹配,移除sorted即可 - 不要提前硬编码list1、list2这类固定变量接收结果,直接遍历返回的分组列表做后续处理即可,适配任意数量的分组场景
内容的提问来源于stack exchange,提问作者user17748569
相关产品推荐
相关产品推荐

