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

如何实现非唯一顶层键的两层嵌套分组?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:35:43