第 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 试试看

  1. 建一个自己的通讯录(3 个联系人),添加、修改、删除各来一次,最后遍历打印。
  2. 统计一句话里每个字出现的次数。
  3. 用「列表里放字典」描述 3 个同学(姓名/年龄/分数),遍历打印每个人的分数,并求平均分。

示例代码:examples/tutorial/07_通讯录.jsh

本章小结