Python中按姓名与颜色分组将2D数组转为指定结构字典的问题
解决按name/color分组并求和size的字典转换问题
我来帮你搞定这个分组求和的问题!你的核心需求是把DictCursor返回的数据集,按name和color嵌套分组,同时对每组的size求和,最后按status收集对应的count值。先说说你现有代码的问题,再给出完整的实现方案。
现有代码的问题
- 变量
name_group和final没有提前初始化,运行时会直接抛出NameError - 完全缺失了
size字段的求和逻辑,这是你需求里的核心环节 - 字典索引方式错误,比如
final['name']['color']这种写法是固定字符串索引,应该用遍历到的变量(比如name、color)来动态获取键
完整实现代码
下面的代码会严格按照你的目标结构生成结果,同时处理size的类型转换(因为你的数据里有字符串、整数、小数等多种格式)和求和:
def transform_data(total): # 先构建中间结构,用来存储每个name-color组的size总和和status对应的count列表 intermediate = {} for result in total: name = result['name'] color = result['color'] status = result['status'] count = str(result['count']) # 保持count的原始格式(比如带L的字符串) # 把size转换为数值类型,确保能正常求和 try: size = float(result['size']) except ValueError: size = 0.0 # 处理无法转换的异常情况,可选调整 # 初始化name层级 if name not in intermediate: intermediate[name] = {} # 初始化color层级,存储size总和和status对应的count集合 if color not in intermediate[name]: intermediate[name][color] = { 'total_size': 0.0, 'status_counts': {} } # 累加当前行的size到对应组 intermediate[name][color]['total_size'] += size # 把count添加到对应status的列表中 if status not in intermediate[name][color]['status_counts']: intermediate[name][color]['status_counts'][status] = [] intermediate[name][color]['status_counts'][status].append(count) # 把中间结构转换成你需要的最终嵌套格式 final_result = {} for name, color_groups in intermediate.items(): final_result[name] = {} for color, group_data in color_groups.items(): # 处理size总和的格式:如果是整数就去掉小数部分,否则保留原格式 total_size = group_data['total_size'] size_key = str(int(total_size)) if total_size.is_integer() else str(total_size) # 组装成目标结构 final_result[name][color] = {size_key: group_data['status_counts']} return final_result # 测试用的数据集(模拟DictCursor返回的结构) total = [ {'name':'JOHN','color':'blue','size':'4','status':'FINISHED','count':'572L'}, {'name':'JOHN','color':'blue','size':'9','status':'NOT STARTED','count':'1357L'}, {'name':'JOHN','color':'orange','size':'267','status':'FINISHED','count':'2973'}, {'name':'JOHN','color':'orange','size':0,'status':'NOT STARTED','count':'444L'}, {'name':'ERIC','color':'green','size':'294','status':'FINISHED','count':'14867L'}, {'name':'ERIC','color':'green','size':'14','status':'NOT STARTED','count':'517L'}, {'name':'ERIC','color':'green','size':'0.00001','status':'RUNNING','count':'16L'} ] # 执行转换并打印结果 print(transform_data(total))
代码说明
- 中间结构构建:先遍历所有数据,按
name→color的层级存储,同时累加size总和,收集每个status对应的count列表 - 格式转换:把中间结构转换成你需要的最终格式,特别处理了
size总和的显示(整数去掉.0,小数保留原精度) - 异常处理:添加了
size转换失败的兜底逻辑,避免因为数据格式问题导致程序崩溃
输出结果验证
运行代码后,输出的结构和你给出的目标结构完全一致:
{ 'JOHN': { 'blue': {'13': {'FINISHED': ['572L'], 'NOT STARTED': ['1357L']}}, 'orange': {'267': {'FINISHED': ['2973'], 'NOT STARTED': ['444L']}} }, 'ERIC': { 'green': {'308.00001': {'FINISHED': ['14867L'], 'NOT STARTED': ['517L'], 'RUNNING': ['16L']}} } }
内容的提问来源于stack exchange,提问作者criscros22
相关产品推荐
相关产品推荐

