如何利用学生字典列表将班级字典列表中的学生ID替换为对应学生字典?
解决班级学生ID替换为学生字典的问题
嘿,你的代码思路明显走偏啦!咱们先看看问题出在哪,再一步步搞定需求。
你的代码问题分析
你用defaultdict把学生和班级都按id存到同一个字典里,然后用update合并——这会把同id的学生和班级信息混在一起,比如id=1的学生字典和id=1的班级字典会被合并成一个四不像的字典,完全不是你想要的“班级里的学生ID替换为对应学生字典”的效果。
正确解法思路
核心是先把学生列表转换成id到学生字典的映射,这样能快速通过ID找到对应的学生,然后遍历每个班级,把班级里的学生ID列表替换成对应的学生字典即可。
完整代码示例
students = [ {"id": 1, "name": "A"}, {"id": 2, "name": "B"}, {"id": 99, "name": "C"}, {"id": 4, "name": "D"}, {"id": 101, "name": "E"}, ] classes = [ {"id": 1, "students": [1, 99]}, {"id": 2, "students": [1, 99, 101, 4]}, {"id": 3, "students": [4, 101]}, ] # 第一步:创建学生ID到学生字典的映射,方便快速查找 student_map = {student["id"]: student for student in students} # 第二步:遍历每个班级,替换学生ID为对应的字典 processed_classes = [] for cls in classes: # 复制原班级字典,避免修改原数据(可选,看需求) new_cls = cls.copy() # 把ID列表替换成学生字典列表 new_cls["students"] = [student_map[sid] for sid in cls["students"]] processed_classes.append(new_cls) # 打印结果 for cls in processed_classes: print(cls)
代码说明
student_map = {student["id"]: student for student in students}:用字典推导式生成映射,时间复杂度O(n),后续查找学生的时间是O(1),效率很高。- 遍历班级时用
cls.copy()是为了不修改原classes列表的数据,如果不需要保留原数据,也可以直接修改原字典:cls["students"] = [...]。 - 列表推导式
[student_map[sid] for sid in cls["students"]]快速完成ID到字典的替换。
运行结果
执行后会得到你想要的格式:
{"id": 1, "students": [{"id": 1, "name": "A"}, {"id": 99, "name": "C"}]} {"id": 2, "students": [{"id": 1, "name": "A"}, {"id": 99, "name": "C"}, {"id": 101, "name": "E"}, {"id": 4, "name": "D"}]} {"id": 3, "students": [{"id": 4, "name": "D"}, {"id": 101, "name": "E"}]}
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

