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