如何将含共同键值对的字典列表转换为以共同值为键的新字典?
按共同键分组字典列表生成新字典
问题
给定一个包含多个字典的列表,所有字典都包含共同键id,需要将列表中的字典按id分组,生成以id为键、对应值为包含details列表的字典的新结构。
原始列表:
original_list = [ {"local_id":1,"id":29,"name":"Ashish"}, {"local_id":2,"id":29,"name":"Boora"}, {"local_id":3,"id":30,"name":"Harshdeep"}, {"local_id":4,"id":30,"name":"Singh"}, {"local_id":5,"id":31,"name":"Deepak"} ]
期望结果:
result_dict = { 29:{'details':[{"local_id":1,"id":29,"name":"Ashish"},{"local_id":2,"id":29,"name":"Boora"}]}, 30:{'details':[{"local_id":3,"id":30,"name":"Harshdeep"},{"local_id":4,"id":30,"name":"Singh"}]}, 31:{'details':[{"local_id":5,"id":31,"name":"Deepak"}]} }
解决方案
方法1:基础遍历构建
直接遍历原始列表,逐个将元素添加到对应分组中:
original_list = [ {"local_id":1,"id":29,"name":"Ashish"}, {"local_id":2,"id":29,"name":"Boora"}, {"local_id":3,"id":30,"name":"Harshdeep"}, {"local_id":4,"id":30,"name":"Singh"}, {"local_id":5,"id":31,"name":"Deepak"} ] result_dict = {} for item in original_list: id_key = item["id"] if id_key not in result_dict: result_dict[id_key] = {"details": []} result_dict[id_key]["details"].append(item) print(result_dict)
方法2:使用collections.defaultdict简化
借助defaultdict自动生成默认结构,减少判断逻辑:
from collections import defaultdict original_list = [ {"local_id":1,"id":29,"name":"Ashish"}, {"local_id":2,"id":29,"name":"Boora"}, {"local_id":3,"id":30,"name":"Harshdeep"}, {"local_id":4,"id":30,"name":"Singh"}, {"local_id":5,"id":31,"name":"Deepak"} ] result_dict = defaultdict(lambda: {"details": []}) for item in original_list: result_dict[item["id"]]["details"].append(item) # 可选:转换为普通字典 result_dict = dict(result_dict) print(result_dict)
方法3:使用itertools.groupby(需先排序)
利用groupby对排序后的列表分组,适合需要分组后做其他处理的场景:
from itertools import groupby original_list = [ {"local_id":1,"id":29,"name":"Ashish"}, {"local_id":2,"id":29,"name":"Boora"}, {"local_id":3,"id":30,"name":"Harshdeep"}, {"local_id":4,"id":30,"name":"Singh"}, {"local_id":5,"id":31,"name":"Deepak"} ] # 先按id排序,确保相同id的元素连续 sorted_list = sorted(original_list, key=lambda x: x["id"]) result_dict = { key: {"details": list(group)} for key, group in groupby(sorted_list, key=lambda x: x["id"]) } print(result_dict)
内容的提问来源于stack exchange,提问作者Ashish Boora
相关产品推荐
相关产品推荐

