Python生成指定结构字典时出现值覆盖问题的技术求助
问题与解决:从数据库数据生成指定结构的Python字典
需求目标
需要生成如下结构的Python字典:
{'student_1': [{2017: 3}, {2018: 4}], 'student_2': [{2017: 60}, {2021: 153}], 'student_3': [{2015: 45}]}
数据来自数据库中的一张表格,结构如下:
| yearfield | count | name |
|---|---|---|
| 2017 | 3 | student_1 |
| 2018 | 4 | student_1 |
| 2017 | 60 | student_2 |
| 2021 | 153 | student_2 |
| 2015 | 45 | student_3 |
遇到的问题
尝试生成字典时,所有学生的对应值都被最后一条数据覆盖,代码如下:
# chartdata 是数据库查询后 fetchall() 的结果 q={} for a,b,c in chartdata: v=[] q[a]=b v.append(q) datasetnew[c] = v # 错误结果 {'student_1': [{2015: 45}], 'student_2': [{2015:45}], 'student_3': [{2015:45}]}
调整代码后又出现新问题:所有学生的所有数据都被混入每个学生的键值中,调整后的代码:
v=[] q={} for a,b,c in chartdata: q[a]=b v.append(q) datasetnew[c] = v
问题原因
- 第一个错误:
q是同一个字典对象,每次循环修改q[a]=b时,之前添加到列表v里的q引用会同步更新,最终所有列表里的字典都指向最后一次修改的结果;同时每次循环重置v=[],导致每个学生只能保留最后一条数据的引用。 - 第二个错误:
v被放在循环外,所有学生共用同一个列表,且q仍是同一个字典对象,导致所有数据混在一起。
正确实现代码
datasetnew = {} # chartdata 是数据库查询后 fetchall() 的结果 for year, count, name in chartdata: # 检查当前学生是否已在字典中,不存在则初始化空列表 if name not in datasetnew: datasetnew[name] = [] # 每次生成新的字典,添加到对应学生的列表中 datasetnew[name].append({year: count})
代码说明
- 初始化
datasetnew为空字典,用于存储最终结果 - 循环遍历每条数据库返回的数据,解构出年份、计数、学生姓名
- 若学生姓名不在
datasetnew中,先为其创建一个空列表 - 每次创建新的字典
{year: count}并添加到对应学生的列表,避免因引用同一个字典对象导致的覆盖问题
内容的提问来源于stack exchange,提问作者Thomas Liddle
相关产品推荐
相关产品推荐

