2026-09-23
Python 入门系列(七):字典与集合——更快地查找
字典是"按名字找"的通讯录。学习键值对增删改查、items() 遍历、经典计数模式,用 set 一行去重,完成班级成绩册练习。
字典与集合:更快地查找
预计学习时间:55 分钟 · 本系列第 7 / 10 课
一、查电话簿的方式,决定你的效率
在列表里找一个学生的成绩,只能从头翻到尾。但真实的电话簿不是这样——你直接按名字翻。**字典(Dict)**就是程序里的电话簿:按"名字"存、按"名字"取,速度极快。
**核心比喻:字典是"按名字找"的通讯录。**每个条目有两部分:键(key)=名字,值(value)=电话号码。键唯一,值随便改。
scores = {"小明": 92, "小红": 85, "小刚": 76}
┌──────────┐ ┌──────────┐
│ 键:"小明" │ ──────► │ 值: 92 │
└──────────┘ └──────────┘
一个键只能对应一个值;键不能重复(重复时后者覆盖前者)
二、字典的增删改查
scores = {"小明": 92, "小红": 85}
# 查 —— 按键取值
print(scores["小明"]) # 92(键不存在会报错!)
print(scores.get("小刚")) # None(get 找不到不报错,更安全)
print(scores.get("小刚", 0)) # 0(找不到时返回默认值)
# 增 / 改 —— 一样的写法:键存在就改,不存在就加
scores["小刚"] = 76 # 新增
scores["小明"] = 95 # 修改
# 删
scores.pop("小红")
# 判断键是否存在
print("小刚" in scores) # True
三、遍历字典的三种姿势
scores = {"小明": 92, "小红": 85, "小刚": 76}
for name in scores: # 默认遍历键
print(name, scores[name])
for name, score in scores.items(): # 同时拿键和值(推荐)
print(f"{name} 的成绩是 {score} 分")
小明 92
小红 85
小刚 76
小明 的成绩是 92 分
小红 的成绩是 85 分
小刚 的成绩是 76 分
四、实战:单词计数器
字典最经典的用法——计数。统计一句话里每个词出现几次:
sentence = "the quick brown fox jumps over the lazy dog the end"
counts = {}
for word in sentence.split(): # split() 按空格切成词列表
if word in counts:
counts[word] += 1 # 见过,次数 +1
else:
counts[word] = 1 # 第一次见,记为 1
print(counts)
{'the': 3, 'quick': 1, 'brown': 1, 'fox': 1, 'jumps': 1, 'over': 1, 'lazy': 1, 'dog': 1, 'end': 1}
五、集合:自动去重的不重复篮子
集合(Set)用花括号但没有键值对,特点:元素不重复、无序:
nums = [1, 2, 2, 3, 3, 3]
unique = set(nums) # 列表转集合,重复自动消失
print(unique) # {1, 2, 3}
print(len(unique)) # 3
# 最常见用法:列表去重(再转回列表)
clean = list(set(nums))
集合还支持数学运算:a & b 交集、a | b 并集、a - b 差集。判断"共同好友""都在场的名单"时特别好使。
六、三种容器怎么选?
- 列表 list:有序、可修改、按位置取 → 待办清单、成绩单
- 字典 dict:按"名字"查找 → 通讯录、配置项、计数
- 集合 set:只要"有没有"、不要重复 → 去重、成员判断
七、避坑指南
- ❌
scores["小刚"]但键不存在 →KeyError。拿不准就用get() - ❌ 键必须是不可变类型:用列表当键会报错,字符串/数字/元组都可以
- ❌ 集合是"无序"的:
{3, 1, 2}打印顺序不保证,别依赖顺序
八、动手练习
练习:班级成绩册。用字典存 3 个学生的成绩,实现:添加学生、查询成绩、计算全班平均分、找出最高分学生。
scores = {}
for i in range(3):
name = input("学生姓名:")
scores[name] = int(input("成绩:"))
avg = sum(scores.values()) / len(scores)
print("平均分:", avg)
top = max(scores, key=scores.get) # 按"值"找最大的"键"
print("最高分:", top, scores[top])
新知识:scores.values() 取出所有值;max(字典, key=字典.get) 表示"比较值,返回键"。
下一课预告:同样的代码不用写三遍——函数来了!