为什么python使用字典生成不正确的值?

noj0wjuj  于 2022-11-19  发布在  Python
关注(0)|答案(1)|浏览(126)

我尝试生成一个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 is a fetchall() from a executed database query
q={}
for a,b,c in chartdata:
    v=[]
    q[a]=b
    v.append(q)
    datasetnew[c] = v

# Results
{'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
f4t66c6m

f4t66c6m1#

使用defaultdict可以更轻松地实现这一点:

from collections import defaultdict

datasetnew = defaultdict(list)
for year, count, name in chartdata:
    datasetnew[name].append({ year: count })

结果是:

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

但是,我想知道为什么要创建一个字典列表,每个字典只有一个键?将这些小字典合并成一个字典似乎更有用:

datasetnew = defaultdict(dict)
for year, count, name in chartdata:
    datasetnew[name][year] = count

这就产生了这样的结构:

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

相关问题