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

Python生成指定结构字典时出现值覆盖问题的技术求助

问题与解决:从数据库数据生成指定结构的Python字典

需求目标

需要生成如下结构的Python字典:

{'student_1': [{2017: 3}, {2018: 4}], 'student_2': [{2017: 60}, {2021: 153}], 'student_3': [{2015: 45}]}

数据来自数据库中的一张表格,结构如下:

yearfieldcountname
20173student_1
20184student_1
201760student_2
2021153student_2
201545student_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

问题原因

  1. 第一个错误:q是同一个字典对象,每次循环修改q[a]=b时,之前添加到列表v里的q引用会同步更新,最终所有列表里的字典都指向最后一次修改的结果;同时每次循环重置v=[],导致每个学生只能保留最后一条数据的引用。
  2. 第二个错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:45:32