第 5 章:字典——用名字找东西
列表用数字下标找东西(成绩[0]),但很多场景我们更想用名字找: 用姓名查电话、用学号查成绩、用单词查释义。这时就要用字典。
5.1 创建和读取字典
字典用大括号 { },每个条目是「键: 值」:
python令 电话簿 = {"小明": "13800000001", "小红": "13800000002"}
打印(电话簿["小明"]) # 13800000001
注意字典里的冒号习惯上写全角「:」,写半角
:也完全可以。 键通常是文本或数字;值可以是任何东西。
添加和修改都直接用方括号赋值:
python电话簿["小刚"] = "13800000003" # 添加
电话簿["小明"] = "13900000001" # 键已存在 → 覆盖旧值
取不存在的键会报错,用 获取 可以带默认值:
python打印(电话簿.获取("小刚")) # 13800000003
打印(电话簿.获取("不存在的人")) # 空
打印(电话簿.获取("不存在的人", "没登记")) # 没登记
5.2 字典的常用方法
| 方法 | 说明 |
|---|---|
d.获取(键, 默认值) | 取值,键不存在时返回默认值(不写默认值返回空) |
d.键() | 所有键,返回列表 |
d.值() | 所有值,返回列表 |
d.包含(键) | 键是否存在,返回真/假 |
d.弹出(键) | 拿走并删除这个键值对 |
d.更新(另一个字典) | 把另一个字典的内容合并进来 |
d.清空() | 清空字典 |
python令 库存 = {"苹果": 10, "香蕉": 5}
库存.更新({"橘子": 8, "苹果": 3}) # 苹果被更新为 3
打印(库存.键()) # ['苹果', '香蕉', '橘子']
打印(库存.值()) # [3, 5, 8]
打印(库存.包含("香蕉")) # 真
5.3 遍历字典
遍历键,再用键取值:
python令 库存 = {"苹果": 10, "香蕉": 5}
遍历 名称 在 库存.键():
打印(名称, "还剩", 库存.获取(名称), "个")
5.4 嵌套:字典套列表、字典套字典
值可以是列表或字典,这样就能表达复杂的数据:
python令 学员 = {
"姓名": "小明",
"年龄": 12,
"爱好": ["编程", "篮球"],
"成绩": {"语文": 90, "数学": 95},
}
打印(学员["姓名"]) # 小明
打印(学员["爱好"][0]) # 编程
打印(学员["成绩"]["数学"]) # 95
这里的多行字典写法是允许的:括号里的内容可以跨行写,行尾逗号可加可不加。
5.5 实战:数单词出现次数
字典最适合做"计数器":
python令 句子 = "石头 剪刀 布 石头 布 布"
令 计数器 = {}
遍历 词 在 句子.拆分(" "):
如果 计数器.包含(词):
计数器[词] = 计数器[词] + 1
否则:
计数器[词] = 1
打印(计数器) # {'石头': 2, '剪刀': 1, '布': 3}
5.6 列表还是字典?
| 需求 | 用什么 |
|---|---|
| 一串有序的东西,按位置访问 | 列表 |
| 按名字/编号查找,键到值的对应 | 字典 |
| 既有序又要按名字查 | 列表里放字典 |
5.7 试试看
- 建一个自己的通讯录(3 个联系人),添加、修改、删除各来一次,最后遍历打印。
- 统计一句话里每个字出现的次数。
- 用「列表里放字典」描述 3 个同学(姓名/年龄/分数),遍历打印每个人的分数,并求平均分。
示例代码:
examples/tutorial/07_通讯录.jsh
本章小结
- 字典
{"键": 值}用名字找值;d[键]取值赋值,d.获取(键, 默认)安全取值 - 方法:获取/键/值/包含/弹出/更新/清空
- 遍历
.键()再取值;值可以嵌套列表和字典 - 字典是天然的"计数器"