在 Python 开发中,字典(dict)是使用率最高、最重要的数据结构,没有之一。
列表擅长有序存储,而字典擅长键值对映射存储,适配业务配置、接口参数、JSON数据、数据库返回结果、多级嵌套数据等90%的真实业务场景。
很多开发者只会基础的取值、赋值,遇到复杂场景直接翻车:
❌ 字典键不存在报错怎么优雅解决?
❌ 如何批量新增、修改、删除字典键值对?
❌ 嵌套多层字典,怎么精准取值、修改?
❌ 如何一键合并多个字典、去重、过滤数据?
❌ 字典遍历顺序错乱、数据覆盖怎么处理?
❌ 如何优雅实现字典默认值、批量规则转换?
今天这篇生产级字典全攻略,完全对标企业开发场景,从基础语法、核心操作、高阶实战到高频坑点全覆盖,和上篇列表教程配套,建议收藏一套吃透!
一、基础认知:字典核心特性
字典(dict):无序(Python3.7+有序)、可变、键值对存储、查询效率极高的容器。
核心规则
✅ 键(key):必须不可变(字符串、数字、元组),唯一不重复
✅ 值(value):任意类型(数字、字符串、列表、字典、对象均可)
✅ 查询速度:O(1),远快于列表遍历查询
基础定义
# 空字典empty_dict = {}# 常规字典user_dict = { "name": "张三", "age": 25, "gender": "男", "hobby": ["打球", "读书"]}print(user_dict)# 输出:{'name': '张三', 'age': 25, 'gender': '男', 'hobby': ['打球', '读书']}
二、核心基础:字典增删改查(必掌握)
所有复杂字典操作,底层都离不开基础增删改查,下面是生产最常用写法。
1、查:取值操作(两种方式)
方式1:键索引取值(新手常用,易报错)
user = {"name": "李四", "age": 28}print(user["name"])# 输出:李四# ❌ 键不存在直接报错 KeyError# print(user["score"])
方式2:get取值(生产首选,容错性强)
键不存在不报错,支持自定义默认值,完美适配业务容错。
user = {"name": "李四", "age": 28}# 键存在,返回原值print(user.get("name"))# 键不存在,返回 Noneprint(user.get("score"))# 键不存在,自定义默认值print(user.get("score", 0))# 输出:李四、None、0
2、增/改:键值对赋值
字典新增和修改语法一致:存在则修改,不存在则新增。
user = {"name": "王五", "age": 22}# 存在key:修改user["age"] = 23# 不存在key:新增user["city"] = "北京"print(user)# 输出:{'name': '王五', 'age': 23, 'city': '北京'}
3、删:精准删除键值对
三种常用删除方式,适配不同业务场景。
user = {"name": "赵六", "age": 30, "city": "上海", "gender": "男"}# 1、del 强制删除del user["gender"]# 2、pop 删除并返回被删除的值(生产常用)age = user.pop("age")# 3、clear 清空所有键值对# user.clear()print(user)# 输出:{'name': '赵六', 'city': '上海'}
三、常用进阶:字典高频内置方法
摒弃低效遍历,熟练使用内置方法,代码极简、性能拉满。
1、keys() / values() / items() 遍历三剑客
info = {"a": 10, "b": 20, "c": 30}# 获取所有键print(list(info.keys())) # ['a', 'b', 'c']# 获取所有值print(list(info.values())) # [10, 20, 30]# 获取所有键值对(遍历首选)print(list(info.items())) # [('a', 10), ('b', 20), ('c', 30)]# 键值对遍历(生产最常用)for k, v in info.items(): print(f"键:{k},值:{v}")
2、update() 批量合并/更新字典
快速批量新增、修改多个键值对,支持字典合并。
old_info = {"name": "小明", "age": 18}new_info = {"age": 19, "city": "广州", "score": 90}# 批量更新+新增old_info.update(new_info)print(old_info)# 输出:{'name': '小明', 'age': 19, 'city': '广州', 'score': 90}
3、setdefault() 优雅设置默认值
键不存在则新增默认值,存在则保留原值,适配数据初始化场景。
data = {"name": "小红"}# 键不存在,新增键值对data.setdefault("age", 20)# 键存在,不修改原值data.setdefault("name", "小白")print(data)# 输出:{'name': '小红', 'age': 20}
四、高阶实战:生产高频场景解法
下面是项目开发90%会用到的字典高阶操作,直接复制即用!
案例1:字典数据过滤(筛选/剔除指定数据)
# 过滤:只保留数值大于15的键值对old_data = {"语文": 80, "数学": 50, "英语": 90, "体育": 10}new_data = {k: v for k, v in old_data.items() if v > 60}print(new_data)# 输出:{'语文': 80, '英语': 90}
案例2:字典键值批量替换/修改
# 所有分数统一加10分score_dict = {"a": 80, "b": 70, "c": 90}new_score = {k: v + 10 for k, v in score_dict.items()}print(new_score)# 输出:{'a': 90, 'b': 80, 'c': 100}
案例3:多字典一键合并(Python3.5+)
dict1 = {"name": "测试"}dict2 = {"age": 25}dict3 = {"city": "深圳"}# 合并多个字典,后者覆盖前者重复keymerge_dict = {**dict1, **dict2, **dict3}print(merge_dict)# 输出:{'name': '测试', 'age': 25, 'city': '深圳'}
案例4:嵌套字典精准取值与修改
真实接口数据、配置数据大多是嵌套字典,多层取值是必备技能。
# 嵌套字典数据user_info = { "id": 1001, "info": { "nickname": "技术博主", "contact": { "phone": "13800138000", "email": "test@qq.com" } }}# 精准取值phone = user_info["info"]["contact"]["phone"]print(phone)# 精准修改user_info["info"]["nickname"] = "Python干货博主"print(user_info)
案例5:字典key/value互换反转
适用于映射关系反转、字典索引重构场景。
old_map = {"a": 1, "b": 2, "c": 3}# 键值互换new_map = {v: k for k, v in old_map.items()}print(new_map)# 输出:{1: 'a', 2: 'b', 3: 'c'}
五、万能规则:字典多条件批量映射替换
对标上篇列表的字典映射玩法,实现一键多规则批量转换,适配状态码、标签转换、数据统一格式化。
# 状态映射规则status_rule = { 0: "禁用", 1: "正常", 2: "待审核"}# 原始数据列表data_list = [{"status": 0, "name": "用户A"}, {"status": 1, "name": "用户B"}, {"status": 2, "name": "用户C"}]# 批量替换字典内状态字段for item in data_list: item["status_text"] = status_rule.get(item["status"], "未知状态")print(data_list)# 输出:[{'status': 0, 'name': '用户A', 'status_text': '禁用'}, ...]
六、新手必避的高频坑点(生产踩坑重灾区)
坑点1:直接索引取值,键不存在报错崩溃
问题:业务数据字段缺失是常态,[]取值直接抛错,导致程序中断。
解决方案:一律使用 dict.get() 取值,兜底默认值。
坑点2:字典键重复,静默覆盖数据
问题:定义字典/合并字典时,重复key会直接覆盖旧值,无任何提示。
解决方案:合并数据前做key校验,或自定义合并逻辑保留新旧数据。
坑点3:遍历字典时新增/删除键值对
问题:遍历过程中修改字典长度,触发迭代异常、数据漏处理。
解决方案:用字典推导式生成新字典,不修改原遍历对象。
坑点4:嵌套字典赋值浅拷贝坑
问题:直接赋值嵌套字典,多个变量共享同一内存,一改全改。
解决方案:复杂字典使用 copy.deepcopy 深拷贝。
七、字典开发选型速查表(一键复用)
💡 安全取值:dict.get(key, 默认值)
💡 批量更新合并:dict.update() / {**dict1,** dict2}
💡 数据过滤、批量修改:字典推导式
💡 键值遍历:for k, v in dict.items()
💡 默认值初始化:dict.setdefault()
💡 多规则数据映射:字典规则映射 + 循环批量处理
💡 嵌套字典处理:分层取值,避免直接暴力索引
写在最后
列表负责有序存储,字典负责映射关系,二者是 Python 数据处理的两大基石。
如果说列表是「数据的容器」,那字典就是「业务数据的结构体」,接口解析、数据清洗、配置管理、状态映射几乎全靠字典实现。
本篇和上篇Python列表全场景攻略形成配套合集,从基础语法到生产高阶、避坑实战全覆盖,建议两篇一起收藏,日常开发直接翻看复用!
持续关注,后续更新 Python 元组、集合、高阶数据处理全套干货!