Lab 6Part 2 数据的组织AI Level 0
词频统计与容器选型
七道题。前五题分别练四种容器,第六题是完整的词频统计,最后一题不写代码——给场景选容器并说明理由。
截止:小作业 2 · 10 月 27 日 周二 23:59
本页目录
本次目标
- 熟练使用字典做统计与查表
- 用集合做去重和成员测试
- 掌握
split/join/strip处理文本 - 建立”面对问题先选容器”的意识
题目
6-1 反转字典
实现 invert(d: dict[str, int]) -> dict[int, str],把键值对调。
invert({"a": 1, "b": 2}) → {1: "a", 2: "b"}
在提交说明里回答:如果原字典有两个键对应同一个值,结果会怎样? 用具体例子说明。
6-2 保序去重
实现 unique_ordered(items: list[int]) -> list[int],去重且保持首次出现的顺序。
unique_ordered([3, 1, 3, 5, 1, 7]) → [3, 1, 5, 7]
要求用集合来加速”见过没有”的判断,不能用 in 去查列表。
在提交说明里解释:为什么用集合比用列表快?
6-3 共同好友
实现 common(a: list[str], b: list[str]) -> list[str],返回两个名单里都出现的名字,按字母序排列。
common(["张三","李四","王五"], ["李四","王五","赵六"]) → ["李四","王五"]
6-4 分组
实现 group_by_first(words: list[str]) -> dict[str, list[str]],按首字母把单词分组。
group_by_first(["apple","avocado","banana"])
→ {"a": ["apple","avocado"], "b": ["banana"]}
6-5 解析成绩单
给定若干行文本,每行格式是 姓名,科目,分数,实现
parse(lines: list[str]) -> dict[str, dict[str, int]],
返回 {姓名: {科目: 分数}} 的嵌套字典。
parse(["张三,数学,87", "张三,物理,92", "李四,数学,65"])
→ {"张三": {"数学": 87, "物理": 92}, "李四": {"数学": 65}}
注意:每行可能有多余的空白,要处理。
6-6 词频统计
实现 top_words(text: str, n: int) -> list[tuple[str, int]],返回出现次数最多的 n 个单词,
每项是 (单词, 次数)。要求:
- 忽略大小写
- 去掉单词两端的标点(至少处理
.,!?;:) - 次数相同时,按字母序排在前面的优先
top_words("The cat. The DOG! the cat", 2)
→ [("the", 3), ("cat", 2)]
6-7 容器选型(不写代码)
为下面每个场景选一种容器,在提交说明里写下选择和一句话理由:
- 记录 116 名学生的学号到姓名的映射
- 记录一次考试所有人的分数,之后要算平均分和最高分
- 判断一个单词是否在一万个常用词的表里
- 表示平面上的一个点,并且要用它当字典的键
- 记录一个班选修的所有课程名,同一门课不重复
- 按提交时间顺序保存学生的多次提交记录
提交前自查
- 每个函数都有类型提示,容器类型写清楚了元素类型
- 6-1、6-2 的问题在提交说明里回答了
- 6-4 处理了首次出现的情况
- 6-5 处理了多余空白
- 6-6 用
("The cat. The DOG! the cat", 2)测过 - 6-7 每条都写了理由