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
相关产品推荐
相关产品推荐

