
1. 字典定义
1.1 字典的基本概念
1.1.1 字典的本质
程序中的字典与生活中的字典逻辑一致,均用于存储 “对应关系”,具体表现为 “键(key)- 值(value)” 对,通过 key 可快速关联并获取对应的 value。
1.1.2 常见应用场景
- 学生姓名与考试成绩的对应(如 “张三” 对应 72 分)
- 歌曲与歌手的对应(如 “晴天” 对应 “周杰伦”)
1.2 字典的定义方式
1.2.1 有内容字典的定义(字面量写法)
- 语法格式:使用花括号 “{}” 包裹多组键值对,key 与 value 用冒号 “:” 分隔,每组键值对用逗号 “,” 分隔;若需用变量存储,直接通过 “变量名 = 字典字面量” 赋值。
# 定义有内容的字典
d1 = {"张三":72,"李四":60,"王五":85}
print(type(d1))# 输出<class 'dict'>,确认类型为字典
print(d1)# 输出{"张三": 72, "李四": 60, "王五": 85}
1.2.2 空字典的定义(两种方式)
空字典的两种定义方式对比表如下:
| | |
|---|
| | |
| | 调用 Python 内置 dict () 函数,无参数传入 |
# 定义空字典
d1 = {}# 空花括号法
d2 =dict()# dict()函数法
print(type(d1),type(d2))# 均输出<class 'dict'>
print(d1, d2)# 均输出{}
1.3 字典中 key 的核心规则
1.3.1 key 不可重复(重复会触发覆盖)
- 规则描述:若字典中出现相同的 key,后定义的 key-value 对会覆盖先定义的内容,且编辑器会提示 “重复 key” 警告。
d1 = {"张三":72,"李四":60,"张三":99}# 重复key“张三”
print(d1)# 输出{"张三": 99, "李四": 60},后定义的99覆盖72
- 解决方案:若存在重复标识(如班级内同名学生),可改用唯一标识作为 key(如学号 “2025001”)。
1.3.2 key 必须是不可变类型(value 无类型限制)
key 与 value 的类型要求对比表如下:
| | | | |
|---|
| | 字符串(“张三”)、数字(250)、元组(("抽烟","喝酒")) | | 不可变类型可作为唯一标识,列表可变故不允许,报错 “TypeError: unhashable type: 'list'” |
| | 数字(72)、字符串(“男”)、列表(["唱歌","跳舞"])、字典({"年龄":18}) | | value 仅需存储数据,无需唯一标识,支持所有 Python 数据类型 |
1.4 字典的嵌套特性
1.4.1 嵌套的概念
字典的 value 可设为任意类型,因此可将 “另一个字典” 作为当前字典的 value,形成 “字典嵌套”,用于存储结构化复杂数据。
1.4.2 实际开发案例(学生信息存储)
- 场景需求:用学号作为唯一 key,value 存储学生的姓名、年龄、成绩、爱好等多维度信息。
student_dict = {
"2025001": {"姓名":"张三","年龄":18,"成绩":72,"爱好": ["抽烟","喝酒","烫头"]},
"2025002": {"姓名":"李四","年龄":19,"成绩":60,"爱好": ["唱歌","跳舞","打台球"]},
"2025003": {"姓名":"王五","年龄":20,"成绩":85,"爱好": ["学习","看书","打太极"]}
}
print(student_dict)# 正常打印嵌套结构,代码中换行不影响运行
1.4.3 嵌套的灵活性
- 层级限制:理论上支持 “无限嵌套”,可根据数据复杂度多层嵌套(如字典内嵌套字典、字典内嵌套列表等)。
- 关键区分:列表不可作为 key,但可作为 value(如案例中 “爱好” 字段对应列表类型)。
2. 字典的增删改查操作
2.1 字典的 “增”:添加键值对
2.1.1 核心方法对比
字典添加键值对主要通过两种方式实现,二者在 “键存在时的处理逻辑” 上存在核心差异,具体对比如下:
| | | |
|---|
| | 若键不存在,向字典新增键值对;若键已存在,会覆盖该键原有值 | |
| | 若键不存在,新增键值对并返回对应值;若键已存在,仅返回原有值(不修改) | 仅适用于 “无则添加、有则保留” 的场景,不会覆盖已有值 |
2.2 字典的 “删”:删除键值对
2.2.1 核心方法对比
字典删除操作包含 “删除指定键”“删除最后一个键值对”“清空字典” 等场景,不同方法的适用场景和风险不同,具体对比如下:
| | | |
|---|
| | | |
| | 删除指定键值对,返回对应值;键不存在时,若指定默认值则返回默认值 | 未指定默认值且键不存在时,会抛出 KeyError |
| | 删除字典中最后一个键值对,返回该键值对(元组格式:(键,值)) | |
| | 清空字典中所有键值对,字典变为空字典(对象仍存在) | |
2.3 字典的 “改”:修改键值对
2.3.1 核心方法说明
字典修改键值对的逻辑简单直接,仅需通过 “已有键赋值” 实现,具体如下:
| | | |
|---|
| | | 必须确保键已存在于字典中,否则会变为 “添加新键值对” 操作 |
2.4 字典的 “查”:查询键值对
2.4.1 单个键值查询方法对比
查询单个键对应的 value 时,主要有 “直接访问” 和 “get () 方法” 两种方式,核心差异在于 “键不存在时的容错性”:
| | | |
|---|
| | | |
| | 返回指定键对应的 value;键不存在时,返回 None(或指定的默认值) | 键不存在时不会报错,容错性高,适合不确定键是否存在的场景 |
2.4.2 批量数据查询方法说明
查询字典中所有键、所有值或所有键值对时,可通过以下方法实现,返回结果均为 “可迭代对象”(需用 list () 转换为列表后才能使用索引):
| | | |
|---|
| | | |
| | | |
| | 获取字典中所有键值对,每个键值对为元组 (key, value) | |
2.4.3 核心要点总结
- 单个值查询优先使用 get () 方法,避免因键不存在导致程序报错;
- 批量查询返回的可迭代对象不支持索引,需通过 list () 转换为列表后才能按索引访问;
3. 字典常用方法总结
3.1 keys 方法
3.1.1 功能
获取字典中所有的键。
3.1.2 返回值类型
并非列表(list),而是 Python 中的特殊类型 —— dict_keys 。
3.1.3 类型特点
- 与列表类似,支持通过循环遍历(例如通过 for item in 结果 逐个获取所有键);
- 不支持通过下标(索引)访问元素,若尝试下标访问会触发报错。
3.1.4 类型转换
可通过 Python 内置函数 list() 将 dict_keys 类型转换为普通列表,示例代码: L1 = list(字典对象.keys())
3.2 values 方法
3.2.1 功能
获取字典中所有的值。
3.2.2 返回值类型
Python 特殊类型 —— dict_values 。
3.2.3 类型特点
与 dict_keys 完全一致:
3.2.4 类型转换
通过内置函数 list() 转换为普通列表,示例代码: L1 = list(字典对象.values())
3.3 items 方法
3.3.1 功能
获取字典中所有的键值对,且每组键值对以元组(格式: (键, 值) )形式呈现。
3.3.2 返回值类型
Python 特殊类型 —— dict_items 。
3.3.3 类型特点
延续 dict_keys 和 dict_values 的特性:
3.3.4 类型转换
通过内置函数 list() 转换为普通列表,转换后列表元素为键值对元组,示例代码: L1 = list(字典对象.items())
3.4 字典常用方法对比表
4. 字典循环遍历
4.1 字典支持的循环类型
4.1.1 不支持的循环类型:while 循环
- 原因:字典是无下标(索引值)的数据结构,而 while 循环的执行通常依赖下标来控制循环次数和访问元素,因此无法对字典进行遍历。
4.1.2 支持的循环类型:for 循环
- 依据:for 循环无需依赖下标,可直接遍历数据结构中的元素(字典中默认遍历 “键”),适配字典的非下标存储结构,因此可用于字典遍历。
4.2 for 循环遍历字典的两种方式
| | | |
|---|
| | | 可通过 key 获取对应 value,与另一种方式效果完全一致 |
| | | 明确指定遍历 key,可通过 key 获取对应 value,与直接遍历效果完全一致 |
4.2.1 两种方式的共性
- 遍历对象统一:无论哪种方式,循环变量最终获取的都是字典中的 “键(key)”,而非 “值(value)”。
- 功能等价性:两种方式均可通过 “字典名 [key]” 的语法获取 key 对应的 value,实现键值对的完整访问。
4.3 遍历中键值对的获取示例
4.3.1 需求描述
- 目标:将字典中的键值对以 “[键] 的成绩是 [值]” 的格式打印输出(例如字典存储学生成绩数据时,输出 “小明的成绩是 90” 这类结果)。
4.3.2 实现语法
假设字典名为 “D1”,循环变量为 “key”,具体代码如下:
for keyin D1:
print(f"{key}的成绩是{D1[key]}")
4.3.3 语法解释
- f-string 格式化:字符串前加 “f” 标识,通过 “{变量名}” 的形式嵌入循环变量和字典值,实现动态拼接。
- 键值获取逻辑:“key” 是循环遍历得到的字典键,“D1 [key]” 通过 “键索引” 语法,从字典 “D1” 中获取该 key 对应的 value。
5. 字典总结
5.1 字典的核心特性
5.1.1 数据结构形式
字典中的数据均以键值对(key:value)形式存储,且每个键(key)唯一对应一个值(value),是典型的映射型数据结构。
5.1.2 键(key)与值(value)的特性对比
5.1.3 下标支持情况
字典不支持下标(索引)访问,无法通过 “字典 [索引值]” 的方式获取数据,需通过 “字典 [key]” 的键值映射关系访问。
5.2 字典的功能支持
5.2.1 基础操作能力
支持数据的增、删、改、查四种核心操作,可满足字典数据的动态管理需求(如新增键值对、删除指定键、修改键对应的值、查询键关联的值)。
5.2.2 遍历功能
支持通过for 循环进行遍历,可依次获取字典中的键、值或键值对(需结合 keys() 、 values() 、 items() 等方法)。
5.3 字典的定位与应用场景
5.3.1 核心定位
字典是“以键找值” 的映射型容器,核心优势在于通过唯一的 “键” 快速定位到对应的 “值”,无需像列表那样通过索引顺序查找。
5.3.2 应用场景
当需要通过唯一标识(键)获取对应信息时,字典是首选数据结构(例如:存储用户信息时,用 “用户名” 作为键,“年龄 / 性别” 作为值)。
5.3.3 开发地位
在 Python 日常开发中,字典与列表是使用频率最高的两个数据容器,二者常根据需求搭配使用(如列表存储多个字典、字典的值为列表等)。
6. 数据容器通用操作
核心说明:数据容器(列表、元组、字符串、集合、字典)的通用操作指跨容器类型可复用的功能,主要包括内置函数、成员判断、循环遍历三类,需注意不同容器对操作的适用性差异。
6.1 通用内置函数
核心要点:通过内置函数实现容器的基础统计(长度、最值、求和),需根据容器内元素类型选择合适函数(如求和需元素为数值型),避免类型错误。
6.1.1 函数功能、适用容器及示例
| | 适用容器(列表 / 元组 / 字符串 / 集合 / 字典) | | |
|---|
| | | len([1,2,3]) 、 len({"a":1,"b":2}) | |
| 获取容器内的最大值(字符串按 ASCII 码比较,字典比较 “键”) | 列表、元组、字符串、集合(需元素可比较);字典(键可比较) | max((4,1,5)) 、 max("python") 、 max({3,0,7}) | |
| | | min([4,1,5]) 、 min("python") 、 min({"x":1,"a":2}) | |
| | 列表、元组、集合(元素需为数值型);字符串、字典(不适用) | sum([1,2,3]) 、 sum({4,5,6}) | |
6.2 通用成员判断操作
核心要点:通过 in 和 not in 判断元素是否存在于容器中,字典仅判断 “键” 是否存在,其他容器判断 “元素 / 字符” 是否存在。
6.2.1 成员判断逻辑及示例
| | | | |
|---|
| | | 2 in [1,2,3] 、 "a" in {"a":1,"b":2} 、 "py" in "python" | |
| | | 4 not in (1,2,3) 、 "c" not in {"a":1,"b":2} 、 "xyz" not in "python" | |
6.3 通用遍历方式(for 循环)
核心要点:通过 for 循环实现容器的遍历,不同容器的 “默认遍历对象” 不同,字典需通过特定方法指定遍历值或键值对。
6.3.1 不同容器的遍历对象及示例
| | | | |
|---|
| | | for num in [1,2,3]: print(num) | |
| | | for char in ("a","b"): print(char) | |
| | | | |
| | | for x in {1,2,3}: print(x) | |
| | 键值对( items() )、值( values() ) | # 默认遍历键 for k in {"a":1,"b":2}: print(k) # 遍历值 for v in {"a":1,"b":2}.values(): print(v) # 遍历键值对 for k,v in {"a":1,"b":2}.items(): print(k,v) | 1. 输出 "a"、"b"2. 输出 1、23. 输出 ("a",1)、("b",2) |
7. 数据容器核心总结
7.1 五大数据容器分类及特性对比
Python 数据容器分为序列类容器(支持下标索引)和非序列类容器(不支持下标索引),核心特性对比如下表所示:
7.2 数据容器通用操作
7.2.1 遍历操作
- for 循环遍历:适用于所有数据容器,直接遍历元素(字典默认遍历键)。
- while 循环遍历:仅适用于序列类容器(列表、元组、字符串),通过下标索引配合循环条件实现。
7.2.2 长度与最值操作
- 长度计算:使用内置函数 len(容器) ,可获取任意数据容器的元素个数(字典为键值对数量)。
- 最值获取:使用内置函数 max(容器) / min(容器) ,获取容器内元素的最大值 / 最小值。
7.2.3 类型转换操作
- 序列类容器互转: list(容器) 、 tuple(容器) 、 str(容器) 可实现列表、元组、字符串的相互转换。
- 转集合: set(容器) 可将其他容器转为集合,自动实现去重,但会打乱有序容器的顺序。
- 转字典: dict(容器) 要求原容器元素为键值对格式(如列表内嵌套元组 [(key1,value1), (key2,value2)] )。