如何实现非唯一顶层键的两层嵌套分组?defaultdict尝试失败
实现两层嵌套的数据分组需求
我懂你想要把这组数据整理成指定的两层嵌套结构,之前尝试用defaultdict没成功大概率是没找对两层嵌套的正确用法,我给你写个清晰的实现方案:
思路解析
我们可以分两步走:
- 第一步:先按
Name做第一层分组,每个Name下再按Place做第二层分组,把对应的Time收集成列表 - 第二步:把这个嵌套字典结构转换成你需要的最终格式
代码实现
from collections import defaultdict # 你的原始数据 data = [{'Name': 'Bob', 'Time': 12, 'Place': 'Home'}, {'Name': 'Bob', 'Time': 11, 'Place': 'Home'}, {'Name': 'Jerry', 'Time': 5, 'Place': 'Home'}, {'Name': 'Jerry', 'Time': 11, 'Place': '-----'}, {'Name': 'Jerry', 'Time': 11, 'Place': 'Work'}] # 构建两层嵌套的临时存储:Name -> Place -> [Time列表] grouped_data = defaultdict(lambda: defaultdict(list)) for item in data: name = item['Name'] place = item['Place'] time = item['Time'] grouped_data[name][place].append(time) # 转换为期望的最终格式 final_result = [] for name, place_time_map in grouped_data.items(): details_list = [{'Place': place, 'Time': times} for place, times in place_time_map.items()] final_result.append({'Name': name, 'Details': details_list}) print(final_result)
代码说明
- 用
defaultdict(lambda: defaultdict(list))创建了两层嵌套的字典:第一层的键是Name,对应的默认值是另一个defaultdict;第二层的键是Place,对应的默认值是空列表,这样可以自动处理不存在的Name或Place,直接往列表里追加Time即可。 - 遍历原始数据时,把每个条目里的字段提取出来,放到对应的分组位置。
- 最后遍历临时存储的嵌套字典,把每个
Place-Time结构转换成Details里的字典,再包装成包含Name和Details的字典,加入结果列表。
运行这段代码后,输出的结果就是你想要的:
[{"Name": "Bob", "Details": [{"Place": "Home", "Time": [12, 11]}]}, {"Name": "Jerry", "Details": [{"Place": "Home", "Time": [5]}, {"Place": "-----", "Time": [11]}, {"Place": "Work", "Time": [11]}]}]
内容的提问来源于stack exchange,提问作者AVD
相关产品推荐
相关产品推荐

