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

如何利用学生字典列表将班级字典列表中的学生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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:42:27