大家在写 Python 时,是不是经常遇到批量创建字典、过滤字典数据、快速转换字典结构的场景? 如果还在傻傻用 for 循环一行行写,代码又长又乱,可读性还差!
今天给大家带来字典推导式最全讲解 + 10个经典实战案例,语法简单、代码简洁、执行高效,新手也能秒懂,直接复制就能用,非常适合发朋友圈、收藏学习!
一、先搞懂:什么是字典推导式?
字典推导式是 Python 独有的极简语法,用一行代码快速生成/处理字典,替代多行 for 循环,核心语法:
# 基础格式
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件表达式}
对比传统循环,差距一目了然:
# 传统循环:生成 {1:1, 2:4, 3:9...10:100}
dict1 = {}
for i in range(1,11):
dict1[i] = i**2
# 字典推导式:一行搞定
dict1 = {i: i**2for i in range(1,11)}
代码直接精简80%,优雅又好读!
二、核心分类:4大类经典场景(附详细案例)
我把字典推导式分成最常用的4类,从简单到进阶,工作中90%的场景都能用。
第一类:基础生成 —— 快速创建新字典
适合:直接根据列表、range等生成全新字典。
案例1:数字键 + 平方值(最基础入门)
需求:生成键1-10,值为对应数字平方的字典
# 推导式
num_dict = {i: i**2for i in range(1, 11)}
print(num_dict)
# 输出:{1: 1, 2: 4, 3: 9, ..., 10: 100}
✅ 说明:i 是键,i**2 是值,循环1-10直接生成。
案例2:列表转字典(键值一一对应)
需求:两个列表,一个存姓名,一个存年龄,快速转字典
names = ["小明", "小红", "小刚"]
ages = [18, 19, 20]
# 推导式(zip打包两个列表)
user_dict = {name: age for name, age in zip(names, ages)}
print(user_dict)
# 输出:{'小明': 18, '小红': 19, '小刚': 20}
✅ 说明:zip() 把两个列表打包成一对一对数据,推导式直接转字典。
案例3:字符串生成字典(字符: ASCII码)
str_dict = {char: ord(char) for char in"python"}
print(str_dict)
# 输出:{'p': 112, 'y': 121, ..., 'n': 110}
第二类:带条件过滤 —— 筛选字典数据
适合:从现有字典/列表中,只保留符合条件的键值对,是工作中最常用的场景!
案例4:筛选值大于指定数字的字典项
需求:保留成绩大于80分的学生
scores = {"小明": 75, "小红": 92, "小刚": 88, "小丽": 65}
# 推导式:值 > 80 才保留
high_scores = {name: score for name, score in scores.items() if score > 80}
print(high_scores)
# 输出:{'小红': 92, '小刚': 88}
✅ 关键点:if score > 80 就是过滤条件。
案例5:筛选指定开头的键
需求:只保留键以小开头的字典项
users = {"小王": 20, "老张": 30, "小李": 25, "老赵": 35}
res = {k: v for k, v in users.items() if k.startswith("小")}
# 输出:{'小王': 20, '小李': 25}
案例6:多条件过滤(值>50 且 键长度=2)
data = {"苹果": 60, "香蕉": 40, "橙子": 70, "西瓜": 30}
res = {k: v for k, v in data.items() if v > 50and len(k) == 2}
# 输出:{'苹果': 60, '橙子': 70}
第三类:键值修改/转换 —— 批量处理字典
适合:不改变数据量,只修改键、修改值、键值互换。
案例7:字典键值互换(高频面试题)
需求:把{键:值} 变成 {值:键}
original = {"a": 1, "b": 2, "c": 3}
reverse_dict = {v: k for k, v in original.items()}
print(reverse_dict)
# 输出:{1: 'a', 2: 'b', 3: 'c'}
✅ 注意:如果值有重复,后面会覆盖前面,仅限值唯一的场景。
案例8:批量修改值(统一计算/格式化)
需求:所有价格打8折
prices = {"可乐": 5, "薯片": 8, "面包": 10}
new_prices = {k: round(v*0.8, 2) for k, v in prices.items()}
# 输出:{'可乐': 4.0, '薯片': 6.4, '面包': 8.0}
案例9:批量修改键(大写/小写/加前缀)
需求:所有键变成大写
old_dict = {"name": "小明", "age": 18}
new_dict = {k.upper(): v for k, v in old_dict.items()}
# 输出:{'NAME': '小明', 'AGE': 18}
第四类:进阶嵌套 —— 处理复杂字典
适合:处理字典里套列表、套字典的复杂数据,爬虫、数据分析常用。
案例10:嵌套数据提取(进阶必学)
需求:从嵌套字典中,提取指定字段
# 原始嵌套数据
students = [
{"name": "小明", "score": 90},
{"name": "小红", "score": 95},
{"name": "小刚", "score": 85}
]
# 推导式:提取 姓名:成绩
student_dict = {stu["name"]: stu["score"] for stu in students}
print(student_dict)
# 输出:{'小明': 90, '小红': 95, '小刚': 85}
三、避坑指南:3个新手常犯错误
忘记用 items()遍历字典必须写 dict.items(),直接写 dict 只会遍历键,会报错!
# 错误
{k:v for k,v in scores}
# 正确
{k:v for k,v in scores.items()}
值重复导致键覆盖字典键唯一,若推导式生成重复键,后面会覆盖前面的数据。
过度使用推导式逻辑超过3层的复杂推导式,可读性会变差,不如用普通循环。
四、总结:什么时候用字典推导式?
看完这篇,你可以:
建议大家收藏+复制代码动手练一遍,字典推导式绝对是 Python 进阶的必备技能!