Python 字典与集合

进阶

字典用键查值(phonebook["小明"]),get() 安全读值,in 检查键是否存在;集合 set 自动去重。统计票数用 votes[name] = votes.get(name, 0) + 1。

适合:中三资讯及通讯科技 · 单元:程式设计进阶 · 建议学习路径第 1/13 课

学完呢课,你会识:
  • 字典以键值对储存:用键查找值,不用记位置。
  • 新增与更新同一写法:d[key] = value;键新则新增、键旧则更新。
  • get() 安全读值:键不存在时返回预设值,不会 KeyError。
文体:编程教学课有声朗读

文体小知识:编程教学课每个概念都配一段可以亲手试的代码例子,照住输入、改一改,最快学会。

资讯及通讯科技Information & Communication Technology

§课文原文 Passage

1字典(Dictionary)是 Python 用来把资料一对一对储存的结构:每一对有一个键(Key)和一个值(Value),就像真正的字典用字查解释、通讯录用姓名查电话。写法:phonebook = {"小明": "9123 4567", "Mary": "6234 7789"}。要查小明的电话,写 phonebook["小明"] 就得 "9123 4567" — 完全不用记住他在清单的第几个位置。

2字典的常用操作很直观:phonebook["阿强"] = "9876 1234" 新增一位联络人;对同一个键再指派一次就会更新。用 in 可以检查键是否存在:"小明" in phonebook 得 True。想安全读值就用 phonebook.get("阿明", "没有纪录") — 键不存在时返回预设文字,程式不会因此出错。

3走访字典用 for name, phone in phonebook.items(): 可以一次过取出所有键值对。另一个好用结构是集合(Set):set(["小明", "阿强", "小明"]) 得 {"小明", "阿强"} — 自动去掉重复元素,而且没有次序。要数班中有多少个不同姓名,交给 set 一步就知。

4实际应用:班长选举点票,用字典做计数器 — votes[name] = votes.get(name, 0) + 1,每唱一票加一,最后哪个键的值最大就当选。通讯录、存货数量、文章字词统计都是同一套路:键做名字,值做数量。学懂字典与集合,处理成批资料快要人一步。

1重点摘要 Summary

字典用键查值(phonebook["小明"]),get() 安全读值,in 检查键是否存在;集合 set 自动去重。统计票数用 votes[name] = votes.get(name, 0) + 1。

2生字卡 Vocabulary

D
Dictionary字典

以键值对储存资料的结构,用键直接查找值,例如通讯录。

K
Key键

字典中用来查找的名称,例如 {"小明": "9123 4567"} 里的「小明」。

V
Value值

键所对应的资料,例如 {"小明": "9123 4567"} 里的电话号码。

K
Key-value pair键值对

字典中一个键配一个值的基本单位,用冒号连接。

g
get()安全取值方法

按键取值,键不存在时返回预设值而不报错,例如 d.get("x", 0)。

i
items()键值对走访

传回所有键值对,配合 for 一次过取出键和值。

i
in (membership test)成员检查

检查某键是否存在于字典或某元素是否存在于集合,结果为 True 或 False。

S
Set集合

无次序、不重复的元素组合,常用来去重,例如 set([1, 1, 2]) 得 {1, 2}。

D
Deduplication去重

把重复的元素只保留一份的处理,是集合的典型用途。

3逐步讲解 Steps

  1. 建立字典与读值字典(Dictionary)以「键—值」成对储存资料:student = {"name": "小明", "class": "3A"}。读值时方括号内写键:student["name"] 得 "小明",student["class"] 得 "3A"。与清单不同,字典用键而非编号存取,因此不必记住资料排第几位,如同通讯录用姓名查电话,而非用「第几个联络人」查电话。键通常是字串且不可重复,值则可以是任何类型,这种弹性令字典成为最常用的资料结构之一。
  2. 新增与更新同一句写法,键新就新增、键旧就更新:student["age"] = 14 新增一对键值;student["class"] = "3B" 把原本的 "3A" 更新为 "3B"。这种一致性令字典操作极为简单:不必区分「加入」与「修改」两种语法。留意更新是直接覆盖旧值,旧值不会保留;若想保留历史纪录,应把值设为清单再用 append 加入。字典会记住新增的次序,列印时按此显示,方便阅读。
  3. 用 get() 安全读值直接以 student["phone"] 读取不存在的键,程式会报 KeyError 而中断;get() 则安全:student.get("phone", "没有填写") 在键不存在时传回预设文字「没有填写」,程式继续运行。第二个参数可以省略,此时传回 None。处理用户输入与外部资料时,键未必齐备,get() 是防错必备工具;例如统计计数常用 votes.get(name, 0),首次遇见某名字时当作 0 看待,然后再加一。
  4. 走访字典与 in 检查走访整个字典用 items():for name, phone in phonebook.items(): print(name, phone) 逐行印出「小明 9123 4567」等配对,items() 同时交出键与值。检查键是否存在用 in:"小明" in phonebook 传回 True,"阿明" in phonebook 传回 False;配合 if 使用:if "阿明" in phonebook: print("找到了")。两者组合可以写出稳健的查询程式:先用 in 检查,存在才读值,KeyError 永远不会发生。
  5. 集合自动去重集合(Set)自动剔除重复元素:set(["小明", "阿强", "小明", "小美"]) 得 {"小明", "阿强", "小美"},只余三个不同姓名。配合 len() 即得人数:len(set(names)) 就是不重复姓名的数目。集合没有次序,不能像清单那样用 scores[0] 读取;它是「只要唯一、不要次序」场合的工具,例如统计班中有多少个不同国籍、问卷出现过哪些不同答案,一步便能完成。
  6. 字典做计数器字典最经典的应用是计数器。票据清单 votes = ["小明", "小美", "小明"],反复执行 votes[name] = votes.get(name, 0) + 1:首次遇见「小明」时 get 传回 0,加 1 后变成 1;第二次遇见时由 1 加至 2。全部处理之后 votes = {"小明": 2, "小美": 1}。这个「查旧值、加一、存回」的句式是编程通用套路,文章字词统计、存货点算、网站流量统计,靠的都是同一招。
  7. 综合应用:唱票程式把上述技巧组合成选班长唱票程式:先建空计数器 count = {};for name in votes: 逐票处理,每票执行 count[name] = count.get(name, 0) + 1;完成后用 max(count, key=count.get) 找出值最大的键,即当选人。整个程式五六行,却完成真实选举的点票工作。同一套路更换资料即可用于:最受欢迎图书借阅统计、食堂最受欢迎菜式调查。字典计数器是资料处理的第一把万用钥匙。

4图解 Diagrams

Python 字典:键值配对 Dict & setstudent = {"name": "小明", "class": "3A"}student["name"] → "小明"# 键 key 揾值 value,好似查字典对比清单:list 用数字位(0,1,2)揾;dict 用名字(键)揾——更快更直观集合 set:{1, 2, 3}——自动剔重复、冇次序,好用嚟「去除重复项」应用:通讯录(名字→电话)、货存(货品→数量)、成绩表拣容器:单排数 → list;要「名字揾嘢」→ dict;要剔除重复 → set
图 1:Python 字典与集合

5例题示范 Example

例题:班长选举唱票结果为 ["小明", "小美", "小明", "阿强", "小明"],用字典统计票数并找出当选人。

  1. 建立空计数器:count = {}。
  2. 逐票走访:for name in votes:,每轮取出一个名字。
  3. 每票加一:count[name] = count.get(name, 0) + 1,首次遇见的名字由 0 起算。
  4. 唱票完成后 count = {"小明": 3, "小美": 1, "阿强": 1};用 max(count, key=count.get) 取值最大的键。
  5. 结果:小明得 3 票当选;可用 sum(count.values()) = 5 核对总票数无误。
  6. 答案:票数统计为小明 3 票、小美 1 票、阿强 1 票,小明以 3 票当选。核心句式是 count[name] = count.get(name, 0) + 1,配合 max(count, key=count.get) 找出最高票者。

6常见错误 Mistakes

✗ 「字典同清单一样,可以用 student[0] 读第一项。」
✓ 字典用键查找,不用编号 — student[0] 只在键恰好是 0 时才有效,一般会出 KeyError。
✗ 「直接读不存在的键最多得 None。」
✓ student["phone"] 遇上不存在的键会出 KeyError 终止程式;想安全就要用 get()。
✗ 「集合可以照 set[0] 这样取出第一个。」
✓ 集合无次序,不支援索引;要逐个处理就用 for item in my_set。
✗ 「set(["小明", "小明"]) 会保留两个小明。」
✓ 集合的本领正是去重 — 结果只有 {"小明"} 一个元素;想保留重复就应该用清单。
✗ 「字典会自动按字母排好次序。」
✓ 字典按插入次序保存键值对,不会自动排序;需要排序时要自己用 sorted() 处理。

75 题快测 Quick check

Q1phonebook = {"小明": "9123 4567", "Mary": "6234 7789"},phonebook["Mary"] 的结果是什么?

Q2set([3, 1, 3, 2, 1]) 的结果是什么?

Q3想读一个可能不存在的键,最稳妥的写法是?A. d["key"] B. d.get("key", 0) C. d.append("key")

Q4"小明" in phonebook 这句用来做什么?

Q5votes = [];逐个执行 votes[name] = votes.get(name, 0) + 1 三次,name 依次为 "小明"、"小美"、"小明"。最后 votes 是什么?

8重点回顾 Recap

  • 字典以键值对储存:用键查找值,不用记位置。
  • 新增与更新同一写法:d[key] = value;键新则新增、键旧则更新。
  • get() 安全读值:键不存在时返回预设值,不会 KeyError。
  • in 检查键是否存在;items() 让 for 同时取出键和值。
  • 集合 set 无次序而且自动去重;统计票数、字词就用字典计数器套路。

同级其他科

同一科其他级别