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) 表示"比较值,返回键"。

下一课预告:同样的代码不用写三遍——函数来了!

← 返回教程列表
顶部