Python字典:自带标签的万能收纳盒
目录
上一章我们吃透了集合set,它擅长清除重复数据、对比两组内容的异同,但集合有个短板——只能单独存一个个零散元素,没法实现「名字对应数值、关键词对应答案」这种配对存储需求。
生活里我们到处都需要一一对应的数据:学生姓名配考试分数、商品名称配单价、问题配标准答案、设备编号配参数。今天要学的字典dict,就是专门解决配对存储的数据类型,像带专属标签的收纳箱,靠标签精准取出对应内容,日常写程序使用频率极高。
一、生活类比看懂字典:带标签的收纳盒
想象一个分格收纳箱,每一格都贴独一无二的标签:
标签写「苹果」,格子里放数字5(代表库存5斤);
标签写「梨」,格子里放数字3(代表库存3斤);
标签写「桃子」,格子里放数字8(代表库存8斤)。
这个收纳箱就是字典,两大核心概念:
- key(键/标签):每一格的标识,必须唯一,不能重复;只能是字符串、数字、元组这类不可变数据;
- value(值/内容):格子里存放的数据,数字、字符串、列表、甚至另一个字典都能放,无限制;
- 整体规则:旧版 Python 字典无序;Python 3.7 及以上版本字典会保留键值对插入顺序。字典依靠 key 取值,不依靠数字下标访问。
客服机器人也是字典典型应用:把用户提问关键词作为key,对应的回复文案作为value,用户输入文字匹配标签,直接调取对应回答。
字典 vs 集合:核心区别对比
在学习字典之前,我们已经掌握了集合(set)。为了帮助大家更好地区分这两个易混淆的数据结构,下面通过表格对比它们的主要差异:
| 对比维度 | 字典(dict) | 集合(set) |
|---|---|---|
| 定义 | 键值对(key-value)存储结构 | 无序、不重复元素的集合 |
| 创建方式 | {key: value, ...} 或 dict() |
{element1, element2, ...} 或 set() |
| 空结构 | {}(空字典) |
set()(空集合) |
| 元素特点 | 键值对:键唯一且不可变,值任意 | 单个元素:元素唯一且不可变 |
| 访问方式 | 通过键(key)访问值(value)dict[key] 或 dict.get(key) |
只能判断元素是否存在element in set |
| 主要用途 | 存储关联数据,如:姓名-分数、商品-价格、关键词-答案 | 去重、集合运算(交集、并集、差集) |
| 核心操作 | 增删改查(基于键)dict[key] = valuedel dict[key]dict.get(key) |
添加、删除、成员判断set.add(element)set.remove(element)element in set |
| 遍历方式 | 遍历键:for key in dict遍历键值对: for key, value in dict.items() |
遍历元素:for element in set |
| 顺序特性 | Python 3.7+ 保留插入顺序 | Python 3.7+ 保留插入顺序 |
| 典型场景 | 配置存储、数据映射、缓存、JSON数据处理 | 去重过滤、关系判断、数学集合运算 |
简单记忆:
- 字典是"带标签的收纳盒"——每个物品都有专属标签,通过标签快速找到对应物品。
- 集合是"无重复的购物篮"——只关心篮子里有哪些不同物品,不关心顺序和数量。
理解这两者的区别,能帮助你在实际编程中选择最合适的数据结构:需要存储配对关系时用字典,只需要去重或集合运算时用集合。
二、字典基础定义与创建方式
2.1 标准大括号创建
字典用{}包裹,键与值用冒号隔开,多组键值对用逗号分隔
# 水果库存字典:key是水果名,value是库存数量
box = {"apple": 5, "pear": 3, "peach": 8}
print(box["apple"]) # 通过标签key提取对应value,输出5
2.2 两种创建空字典的写法
这里要避开集合的经典坑:{}是空字典,不是空集合;空集合必须用set()
# 方式1:直接空大括号
d1 = {}
print(type(d1)) # <class 'dict'>
方式2:dict()函数创建空字典
d2 = dict()
print(type(d2))
2.3 dict快速生成字典
除大括号,还能用dict()快速构造键值对,可读性更高
# 用dict创建学生成绩字典
score = dict(小红=95, 小李=88, 小张=72)
print(score["小红"]) # 95
小提示:这种dict(键=值, ...)的赋值写法,键只能是合法的变量名(字母、数字、下划线组成,且不能以数字开头),不能包含空格、中文特殊符号等。如果键是数字、带空格的字符串或其他不符合变量名规则的标识符,必须使用大括号{}方式创建字典。
2.4 嵌套字典
value可以是另一个字典,实现多层数据存储,适合分类数据
# 食物分类字典,food下嵌套cake、egg子字典
d = {
'food': {
'cake': 1,
'egg': 5
},
'cake': 2,
'egg': 3
}
# 取出food内部egg对应数字5
print(d['food']['egg'])
三、字典四大核心操作:增、删、改、查
字典是可变类型,支持新增、修改、删除、查询全套操作,全部依靠key标签实现。
3.1 新增键值对
直接给不存在的key赋值,自动添加一组新数据
box = {"apple": 5, "pear": 3}
# 新增桃子库存
box["peach"] = 8
print(box)
# 输出 {'apple': 5, 'pear': 3, 'peach': 8}
3.2 修改已有数据
给已存在的key重新赋值,直接覆盖原有value
box = {"apple": 5, "pear": 3}
# 修改梨的库存
box["pear"] = 9
print(box)
# 输出 {'apple': 5, 'pear': 9}
3.3 查询数据(两种方法,区分使用场景)
方式1:直接索引 字典[key]
key必须存在,不存在会直接报错,适合百分百确定标签存在的场景
box = {"apple": 5, "pear": 9}
print(box["pear"]) # 输出9
方式2:get()方法
语法:字典.get(key, 默认值)
key存在则返回对应数值;key不存在不会崩溃,直接返回预设默认值
score = {"小红": 95}
# key存在,正常取值
print(score.get("小红", "不及格")) # 95
# key不存在,返回预设文字
print(score.get("小明", "不及格")) # 不及格
3.4 删除键值对
| 方法 | 功能特点 | 适用场景 |
|---|---|---|
del 字典[key] |
删除指定key对应的整组数据 | 明确知道key存在,直接删除 |
pop(key, 默认值) |
删除并返回value;不存在返回默认 | 需要拿到被删除的数据,兼顾容错 |
popitem() |
删除并返回最后插入的键值对(Python 3.7+) | 按LIFO顺序清理数据,或清空字典 |
clear() |
清空字典所有内容,变为空字典 | 需要重置全部数据 |
完整代码演示:
fruit = {"apple": 3, "pear": 4, "banana": 2}
# del删除指定key
del fruit["pear"]
print(fruit) # {'apple': 3, 'banana': 2}
pop删除并返回值
res = fruit.pop("apple", "无此商品")
print("被删除的库存:", res)
popitem() 删除并返回最后插入的键值对(Python 3.7+)
item = fruit.popitem()
print("删除的键值对:", item) # 输出 ('banana', 2),因为它是最后插入的
clear清空全部
fruit.clear()
print(fruit) # {}
3.5 字典合并与更新
在实际开发中,经常需要将两个字典合并为一个,或者用一个字典的内容更新另一个字典。Python 提供了两种主要方式:update() 方法和 | 合并运算符(Python 3.9+)。
update() 方法:原地更新
update() 方法会将另一个字典的键值对合并到当前字典中,如果键已存在则覆盖原值。这个方法会直接修改原字典,不会创建新字典。
# 示例1:基本合并
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 20, "c": 3}
dict1.update(dict2)
print(dict1) # 输出:{'a': 1, 'b': 20, 'c': 3}
注意:dict1 被修改,dict2 的 b=20 覆盖了 dict1 的 b=2
# 示例2:合并多个字典
base = {"name": "小明", "age": 18}
extra_info = {"score": 95, "city": "北京"}
more_info = {"hobby": "编程", "age": 19} # age 会被覆盖
base.update(extra_info)
base.update(more_info)
print(base) # 输出:{'name': '小明', 'age': 19, 'score': 95, 'city': '北京', 'hobby': '编程'}
| 合并运算符:创建新字典
Python 3.9 引入了字典合并运算符 |,它返回一个新字典,不会修改原字典。如果键冲突,右边的字典值会覆盖左边的。
# 示例3:使用 | 运算符合并
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 20, "c": 3}
result = dict1 | dict2
print(result) # 输出:{'a': 1, 'b': 20, 'c': 3}
print(dict1) # 输出:{'a': 1, 'b': 2}(原字典不变)
print(dict2) # 输出:{'b': 20, 'c': 3}(原字典不变)
# 示例4:链式合并多个字典
dict_a = {"x": 10}
dict_b = {"y": 20}
dict_c = {"x": 100, "z": 30}
merged = dict_a | dict_b | dict_c
print(merged) # 输出:{'x': 100, 'y': 20, 'z': 30}
dict_c 的 x=100 覆盖了 dict_a 的 x=10
两种方式的区别
| 特性 | update() 方法 |
| 合并运算符 |
|---|---|---|
| 修改原字典 | 是,原地修改 | 否,返回新字典 |
| Python 版本要求 | 所有版本 | Python 3.9+ |
| 返回值 | None(无返回值) | 新字典 |
| 适用场景 | 需要更新现有字典 | 需要保留原字典,创建合并副本 |
| 链式操作 | 不支持,需多次调用 | 支持,可连续合并多个字典 |
选择建议:
- 如果需要修改原字典,使用
update()。 - 如果需要保留原字典不变,或者使用 Python 3.9+ 且希望代码更简洁,使用
|运算符。 - 注意
|运算符在 Python 3.8 及以下版本不可用。
四、提取字典全部键、值、完整键值对
开发中经常需要单独取出字典全部键、全部值,Python提供三个内置方法,转列表后方便操作:
.keys():提取字典全部key(键).values():提取字典全部value(值).items():提取完整(key, value)元组配对
box = {"apple": 5, "pear": 3, "peach": 8}
# 提取全部键
all_key = list(box.keys())
print("所有水果名称:", all_key)
# 提取全部值
all_val = list(box.values())
print("所有库存数量:", all_val)
# 提取完整键值对
all_item = list(box.items())
print("完整商品-库存配对:", all_item)
五、字典循环遍历全方案
字典直接循环时,默认遍历所有key,搭配三种提取方法实现不同遍历需求。
5.1 只遍历key(默认方式)
box = {"apple": 5, "pear": 8}
for fruit in box:
print(fruit)
# 输出 apple pear
5.2 同时遍历key和value
搭配.items()一次性取出标签和对应数据
box = {"apple": 5, "pear": 8}
for fruit, num in box.items():
print(f"水果:{fruit},库存:{num}")
# 水果:apple,库存:5
# 水果:pear,库存:8
5.3 仅遍历value
box = {"apple": 5, "pear": 8}
for num in box.values():
print("库存:", num)
六、成员判断 in 语法
in 单独判断字典key是否存在,不会匹配value
box = {"apple": 9, "pear": 0}
# 判断标签apple是否存在
if "apple" in box:
print("货架上有苹果")
# 数字9是value,用in无法匹配
if 9 in box:
print("不会执行这条代码")
小提示:如果想要判断某个 value 是否存在,需要写 if x in box.values(),in 不会自动检索 value。例如:
box = {"apple": 9, "pear": 0}
# 判断value 9是否存在
if 9 in box.values():
print("存在库存为9的水果")
else:
print("没有库存为9的水果")
七、综合实战案例:简易客服关键词匹配
结合分词思路,实现极简问答机器人,贴合资料里客服场景,完整可运行:
# 问答字典:key是关键词,value是对应回复
robot_dict = {
"价格": "本店所有商品均价29.9元",
"发货": "下单后48小时内安排快递",
"售后": "七天无理由退换,联系客服处理"
}
# 用户输入提问
user_text = "请问产品价格是多少?"
# 遍历关键词匹配用户问题
for keyword, reply in robot_dict.items():
if keyword in user_text:
print("机器人回复:", reply)
break
else:
print("未识别问题,请重新提问")
八、字典推导式
字典推导式(Dictionary Comprehension)是 Python 中一种简洁、高效的字典创建方式,语法与列表推导式类似,但用于生成字典。它特别适合需要根据已有数据快速构建字典的场景。
8.1 基本语法
字典推导式的基本语法为:
{key表达式: value表达式 for 变量 in 可迭代对象 if 条件}
其中:
- key表达式:用于生成字典键的表达式
- value表达式:用于生成字典值的表达式
- 变量:从可迭代对象中取出的每个元素
- 可迭代对象:列表、元组、字符串、range等
- if 条件:可选,用于过滤元素
示例1:快速生成数字平方字典
使用字典推导式快速创建数字与其平方值的对应字典:
# 生成1到5的数字平方字典
squares = {x: x**2 for x in range(1, 6)}
print(squares)
# 输出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
带条件的字典推导式:只生成偶数的平方
even_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares)
输出:{2: 4, 4: 16, 6: 36, 8: 64, 10: 100}
示例2:从列表创建键值对字典
将两个列表合并为一个字典,一个列表作为键,另一个列表作为值:
# 两个列表:水果名称和对应价格
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
prices = [8.5, 3.2, 4.8, 12.0]
使用zip函数和字典推导式创建字典
fruit_price_dict = {fruit: price for fruit, price in zip(fruits, prices)}
print(fruit_price_dict)
输出:{'苹果': 8.5, '香蕉': 3.2, '橙子': 4.8, '葡萄': 12.0}
过滤价格高于5元的水果
expensive_fruits = {fruit: price for fruit, price in zip(fruits, prices) if price > 5}
print(expensive_fruits)
输出:{'苹果': 8.5, '葡萄': 12.0}
示例3:转换现有字典
字典推导式还可以用于转换现有字典,例如将所有值转换为字符串:
# 原始字典
original = {"a": 1, "b": 2, "c": 3}
# 将所有值转换为字符串
str_dict = {key: str(value) for key, value in original.items()}
print(str_dict)
# 输出:{'a': '1', 'b': '2', 'c': '3'}
键值互换(前提是所有值都可哈希且唯一)
reversed_dict = {value: key for key, value in original.items()}
print(reversed_dict)
输出:{1: 'a', 2: 'b', 3: 'c'}
⚠️ 警告:若原字典多个value相同,键值互换会发生数据丢失
举例:test = {"a":1,"b":1},互换后结果 {1:"b"},a直接丢失
8.2 字典推导式的优势
- 代码简洁:一行代码完成多行循环才能实现的功能
- 执行效率高:通常比普通for循环更快
- 可读性强:语法直观,意图明确
- 灵活性高:支持条件过滤和复杂表达式
注意事项
- 键必须是可哈希类型(字符串、数字、元组等)
- 键重复时,后面的值会覆盖前面的值
- 返回新字典,不修改原数据
- 复杂逻辑建议使用普通for循环
字典推导式是 Python 编程中的高效工具,熟练掌握后能显著提升代码质量和开发效率。
九、本章总结
字典是专门用于键值配对存储的组合数据类型,依靠唯一标签key快速查找对应数据,在成绩统计、商品管理、问答匹配、参数存储场景无可替代。
核心操作分为增删改查四大类,get()、.items()是日常编码最高频方法;嵌套字典可以实现多层分类存储,满足复杂数据管理需求。
到此为止,我们完整学完Python全部四类组合数据:有序序列(字符串、列表、元组)、去重集合、键值对字典,下一章我们将开启全新篇章,学习文件读写操作,掌握程序读取、保存本地文本的能力。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)