You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:06:01