Python中为字典已有键扩展值:处理成绩列表生成目标字典
解决字典键关联多组值的问题
嗨,我来帮你搞定这个问题!你遇到的核心问题是:直接给字典键赋值会覆盖掉之前的内容,而且你尝试的dict1.extend用法不对——字典本身没有extend方法,得针对字典里的列表来操作才行。
下面给你两种可行的解决方案,都能得到你想要的结果:
方法1:手动判断键是否存在(无需额外模块)
这种方法适合不想引入额外库的场景,逻辑清晰直观:
Marks =[ [12345,75,'English'], [23452,83,'Physics'], [23560,81,'Statistics'], [23415,61,'Computer'], [23459,90,'Physics'], [12345,75,'Computer'], [23452,100,'Statistics'] ] # 初始化空字典 course_scores = {} for item in Marks: # 解构子列表,让代码更易读 student_id, score, course_name = item # 如果课程名不在字典里,先创建一个空列表作为值 if course_name not in course_scores: course_scores[course_name] = [] # 将当前学生的ID和分数作为列表追加到对应课程的列表中 course_scores[course_name].append([student_id, score]) print(course_scores)
运行这段代码后,就能得到你期望的结果:
{ 'English': [[12345, 75]], 'Physics': [[23452, 83], [23459, 90]], 'Statistics': [[23560, 81], [23452, 100]], 'Computer': [[23415, 61], [12345, 75]] }
方法2:使用collections.defaultdict(更简洁)
Python的collections模块里的defaultdict可以自动为不存在的键创建默认值(这里我们指定默认值为列表),省去手动判断的步骤:
from collections import defaultdict Marks =[ [12345,75,'English'], [23452,83,'Physics'], [23560,81,'Statistics'], [23415,61,'Computer'], [23459,90,'Physics'], [12345,75,'Computer'], [23452,100,'Statistics'] ] # 初始化一个默认值为列表的字典 course_scores = defaultdict(list) for student_id, score, course_name in Marks: # 直接追加即可,不存在的键会自动创建空列表 course_scores[course_name].append([student_id, score]) # 可选:如果需要转换成普通字典(不是必须的,defaultdict本身也可以正常使用) course_scores = dict(course_scores) print(course_scores)
为什么你之前的方法不行?
- 你最初的
dict1[i[2]]=i[0],i[1]会把值设成元组,而且每次赋值都会覆盖之前的内容,所以最后每个键只保留了最后一组数据。 - 你尝试的
dict1.extend是错误的,因为字典对象没有extend方法——extend是列表的方法,你应该对字典中对应键的列表调用append或extend,但前提是这个键已经关联了一个列表,否则会报错。
内容的提问来源于stack exchange,提问作者user10613120
相关产品推荐
相关产品推荐

