使用多key对dict_array分组后将剩余字段归入array的高效实现方法
优化方案
你原来的实现每次添加元素都要遍历全列表查找分组,单次操作时间复杂度为O(n),总复杂度为O(n²),数据量大的时候运行效率必然很低。改用哈希映射(临时字典)做分组索引可以把查找复杂度降到O(1),总复杂度降到O(n),效率提升非常明显。
1. 全量数据一次性分组实现
如果是拿到完整的dict_array后一次性处理,直接用以下代码即可:
def group_by_ab(dict_array): # 临时哈希索引,key为(a,b)元组,value为对应的分组结构 group_map = {} for item in dict_array: # 生成唯一分组key group_key = (item['a'], item['b']) if group_key not in group_map: # 分组不存在则新建 group_map[group_key] = { 'a': item['a'], 'b': item['b'], 'array': [] } # 提取剩余键值对加入array rest = {k:v for k,v in item.items() if k not in ('a', 'b')} group_map[group_key]['array'].append(rest) # 返回所有分组的列表,如果只有一个分组取返回值[0]即可 return list(group_map.values()) # 测试示例 dict_array=[ {'a':1,'b':1,'c':11,'d':21}, {'a':1,'b':1,'c':12,'d':22}, {'a':1,'b':1,'c':13,'d':23} ] result = group_by_ab(dict_array) print(result[0])
执行后输出的result[0]完全匹配你给出的期望结果。
2. 支持逐条添加的实现(兼容原有逻辑)
如果需要像你原来的dict_bucket函数那样逐条添加元素,可以复用分组索引,不用每次遍历全列表:
# 分组索引和结果存储变量,也可以封装到类中避免全局变量 group_map = {} result_array = [] def dict_bucket(add_dict): group_key = (add_dict['a'], add_dict['b']) if group_key in group_map: # 分组已存在,直接追加剩余字段 rest = {k:v for k,v in add_dict.items() if k not in ('a', 'b')} group_map[group_key]['array'].append(rest) print('Bucketed') else: # 分组不存在,新建分组加入结果列表 new_group = { 'a': add_dict['a'], 'b': add_dict['b'], 'array': [{k:v for k,v in add_dict.items() if k not in ('a', 'b')}] } group_map[group_key] = new_group result_array.append(new_group) print('Not Bucketed')
内容的提问来源于stack exchange,提问作者marantz
相关产品推荐
相关产品推荐

