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

Python嵌套dictionary comprehension分组写法问题求解

嵌套字典推导式数据转换问题

给定基础数据

待转换的原始数据集如下:

data =[
    ['Peter', 'June', 100],
    ['Peter', 'July', 200],
    ['Peter', 'August', 120],
    ['Peter', 'September', 202],
    ['Bob', 'June', 300],
    ['Bob', 'July', 101],
    ['Bob', 'August', 200],
    ['Bob', 'September', 100]
]

预期转换后的目标结构:

targets = {
    'June': {'Peter': 100, 'Bob': 300},
    'July': {'Peter': 200, 'Bob': 101},
    'August': {'Peter': 120, 'Bob': 200},
    'September': {'Peter': 202, 'Bob': 100}
}

原有代码问题

之前编写的错误实现:

targets = {row[1]: {row[0]: row[2] for row in data} for row in data}

运行后所有外层月份对应的内层字典完全一致,均为最后一组数据的映射结果,不符合预期:

{ 
 'June': {'Peter': 202, 'Bob': 100}, 
 'July': {'Peter': 202, 'Bob': 100}, 
 'August': {'Peter': 202, 'Bob': 100}, 
 'September': {'Peter': 202, 'Bob': 100}
}

错误原因:内层字典推导式每次都遍历全量data数据,没有和外层当前月份做匹配过滤,遍历过程中同名字段会被后续值覆盖,最终每个内层字典都是全量数据遍历完的最终覆盖结果,和外层月份没有关联。

正确实现方案

  • 纯嵌套字典推导式写法
    外层先通过集合去重拿到所有唯一月份作为键,内层推导式增加月份匹配判断,只筛选当前月份对应的人员和分数生成内层字典:
    targets = {
        month: {name: score for name, m, score in data if m == month}
        for month in {row[1] for row in data}
    }
    
  • 高性能单次遍历写法
    数据量较大时,纯推导式写法内层会重复遍历全量数据,性能偏低,用一次循环即可完成组装,逻辑更直观效率更高:
    targets = {}
    for name, month, score in data:
        targets.setdefault(month, {})[name] = score
    

两种写法运行后都能得到符合要求的目标结构。


内容的提问来源于stack exchange,提问作者Prashant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:54:23