学习前提

理解Python条件、循环与索引;本课区分序列、映射和集合。

本课完成后你能做什么

选择合适容器并理解共享引用,完成查找、筛选和排序。

先理解机制

列表保存有顺序的序列,字典把键映射到值,集合表达去重与成员关系。课程记录可用字典,一组课程用列表,已完成id用集合。先考虑数据关系而不是看到所有数据都塞进同一种容器。

字典取不存在的键会抛KeyError;get允许提供默认值,但默认值是否合理取决于业务。缺少时长不能总被当作0,否则统计掩盖数据错误。in对字典检查键,对列表检查元素,含义随容器变化。

列表和字典是可变对象。复制列表只复制外层,内部字典可能仍共享;通过新列表修改记录会影响原记录。需要独立记录时逐项复制,嵌套更深则重新思考数据模型或使用深复制。

sorted返回新列表,list.sort原地修改并返回None。key函数描述排序依据,不要把sort的返回值当排序结果。集合不适合承担对用户可见的稳定展示顺序,需要输出时明确排序。

可运行示例

使用Python 3.11或更新版本,将代码保存为独立练习目录中的lesson.py,在该目录执行 python3 lesson.py;Windows也可使用 py lesson.py。示例只使用标准库。

courses = [{"id": 1, "title": "Python", "minutes": 30},
           {"id": 2, "title": "SQL", "minutes": 20},
           {"id": 3, "title": "Java", "minutes": 40}]
done = {1, 1, 3}
pending = [item for item in courses if item["id"] not in done]
ordered = sorted(courses, key=lambda item: item["minutes"])
print([item["title"] for item in pending])
print([item["id"] for item in ordered])
print([item["id"] for item in courses])
print(len(done))

推演与验证

待学只有SQL,排序id为2、1、3,原顺序保持1、2、3,集合长度为2。改用courses.sort后再看原列表,观察原地修改;恢复代码避免后续实验受到已排序状态影响。

常见错误与边界

不要把标题当唯一id,相同标题可以属于不同记录。列表推导式适合清晰转换,不适合塞进多层副作用和复杂异常处理。

动手练习

生成id到课程的字典,查找id2;若id不存在返回明确提示。再计算所有未完成课程时长。

参考解法与理由

用字典推导建立映射,先确认id唯一,重复键会覆盖前值。未完成总时长用sum,空集合自然得到0;缺失时长应先校验而不是静默归零。

进一步阅读