目录

一、生活类比看懂字典:带标签的收纳盒

二、字典基础定义与创建方式

2.1 标准大括号创建

2.3 dict快速生成字典

2.4 嵌套字典

三、字典四大核心操作:增、删、改、查

3.1 新增键值对

3.2 修改已有数据

3.3 查询数据(两种方法,区分使用场景)

方式1:直接索引 字典[key]

方式2:get()方法

3.4 删除键值对

3.5 字典合并与更新

update() 方法:原地更新

| 合并运算符:创建新字典

两种方式的区别

四、提取字典全部键、值、完整键值对

五、字典循环遍历全方案

5.1 只遍历key(默认方式)

5.2 同时遍历key和value

5.3 仅遍历value

六、成员判断 in 语法

七、综合实战案例:简易客服关键词匹配

八、字典推导式

8.1 基本语法

示例1:快速生成数字平方字典

示例2:从列表创建键值对字典

示例3:转换现有字典

8.2 字典推导式的优势

九、本章总结


上一章我们吃透了集合set,它擅长清除重复数据、对比两组内容的异同,但集合有个短板——只能单独存一个个零散元素,没法实现「名字对应数值、关键词对应答案」这种配对存储需求。

生活里我们到处都需要一一对应的数据:学生姓名配考试分数、商品名称配单价、问题配标准答案、设备编号配参数。今天要学的字典dict,就是专门解决配对存储的数据类型,像带专属标签的收纳箱,靠标签精准取出对应内容,日常写程序使用频率极高。

一、生活类比看懂字典:带标签的收纳盒

想象一个分格收纳箱,每一格都贴独一无二的标签:

标签写「苹果」,格子里放数字5(代表库存5斤);

标签写「梨」,格子里放数字3(代表库存3斤);

标签写「桃子」,格子里放数字8(代表库存8斤)。

这个收纳箱就是字典,两大核心概念:

  1. key(键/标签):每一格的标识,必须唯一,不能重复;只能是字符串、数字、元组这类不可变数据;
  2. value(值/内容):格子里存放的数据,数字、字符串、列表、甚至另一个字典都能放,无限制;
  3. 整体规则:旧版 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] = value
del 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

这里要避开集合的经典坑:{}是空字典,不是空集合;空集合必须用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提供三个内置方法,转列表后方便操作:

  1. .keys():提取字典全部key(键)
  2. .values():提取字典全部value(值)
  3. .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 字典推导式的优势

  1. 代码简洁:一行代码完成多行循环才能实现的功能
  2. 执行效率高:通常比普通for循环更快
  3. 可读性强:语法直观,意图明确
  4. 灵活性高:支持条件过滤和复杂表达式

注意事项

  • 键必须是可哈希类型(字符串、数字、元组等)
  • 键重复时,后面的值会覆盖前面的值
  • 返回新字典,不修改原数据
  • 复杂逻辑建议使用普通for循环

字典推导式是 Python 编程中的高效工具,熟练掌握后能显著提升代码质量和开发效率。

九、本章总结

字典是专门用于键值配对存储的组合数据类型,依靠唯一标签key快速查找对应数据,在成绩统计、商品管理、问答匹配、参数存储场景无可替代。

核心操作分为增删改查四大类,get().items()是日常编码最高频方法;嵌套字典可以实现多层分类存储,满足复杂数据管理需求。

到此为止,我们完整学完Python全部四类组合数据:有序序列(字符串、列表、元组)、去重集合、键值对字典,下一章我们将开启全新篇章,学习文件读写操作,掌握程序读取、保存本地文本的能力。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐