CS1602计算导论
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 容器选型(不写代码)

为下面每个场景选一种容器,在提交说明里写下选择和一句话理由:

  1. 记录 116 名学生的学号到姓名的映射
  2. 记录一次考试所有人的分数,之后要算平均分和最高分
  3. 判断一个单词是否在一万个常用词的表里
  4. 表示平面上的一个点,并且要用它当字典的键
  5. 记录一个班选修的所有课程名,同一门课不重复
  6. 按提交时间顺序保存学生的多次提交记录

提交前自查

  • 每个函数都有类型提示,容器类型写清楚了元素类型
  • 6-1、6-2 的问题在提交说明里回答了
  • 6-4 处理了首次出现的情况
  • 6-5 处理了多余空白
  • 6-6 用 ("The cat. The DOG! the cat", 2) 测过
  • 6-7 每条都写了理由