字典推导式是 Python 极简高效的语法,能一行代码快速生成、筛选、转换字典,替代冗长的 for 循环,日常开发、数据处理高频使用。
本文整理入门→进阶→实战全场景案例,零基础也能看懂,建议收藏备用。
一、基础语法回顾
标准格式
{键表达式: 值表达式 for 变量 in 可迭代对象}
带条件筛选格式
{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件}
核心逻辑:遍历可迭代对象,按规则生成键值对,支持条件过滤、键值修改、数据转换。
二、入门基础案例(新手必练)
案例1:基础生成字典(数值映射)
需求:生成 {1:10, 2:20, 3:30 ... 10:100} 字典 传统循环写法:
dic = {}
for i in range(1, 11):
dic[i] = i * 10
print(dic)
字典推导式一行实现:
dic = {i: i*10for i in range(1, 11)}
print(dic)
# 输出:{1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70, 8: 80, 9: 90, 10: 100}
案例2:列表转字典(两两配对)
需求:两个列表,一个做键、一个做值,合并为字典
keys = ["name", "age", "gender"]
values = ["小明", 20, "男"]
# 推导式 + zip 配对
new_dic = {k: v for k, v in zip(keys, values)}
print(new_dic)
# 输出:{'name': '小明', 'age': 20, 'gender': '男'}
三、条件筛选案例(最常用)
案例3:筛选字典(保留符合条件的键值对)
原始字典:学生成绩,只保留分数大于80分的学生
score = {"张三": 75, "李四": 92, "王五": 88, "赵六": 60}
# 条件筛选:值 > 80
high_score = {name: s for name, s in score.items() if s > 80}
print(high_score)
# 输出:{'李四': 92, '王五': 88}
案例4:过滤指定键(剔除无用字段)
需求:剔除字典中 age 键,保留其他数据
user = {"id": 101, "name": "小红", "age": 18, "city": "北京"}
new_user = {k: v for k, v in user.items() if k != "age"}
print(new_user)
# 输出:{'id': 101, 'name': '小红', 'city': '北京'}
四、键/值修改转换(进阶用法)
案例5:字典键值互换
适用场景:反向查询、数据反转
old_dic = {"a": 1, "b": 2, "c": 3}
# 键 ↔ 值 互换
new_dic = {v: k for k, v in old_dic.items()}
print(new_dic)
# 输出:{1: 'a', 2: 'b', 3: 'c'}
注意:值不能重复,重复值会导致数据丢失。
案例6:统一修改所有值(批量运算)
需求:给所有成绩 +5 分
score = {"语文": 80, "数学": 90, "英语": 85}
new_score = {k: v+5for k, v in score.items()}
print(new_score)
# 输出:{'语文': 85, '数学': 95, '英语': 90}
案例7:键名统一格式化
需求:把所有键转为大写字母
data = {"apple": 10, "banana": 20, "orange": 15}
new_data = {k.upper(): v for k, v in data.items()}
print(new_data)
# 输出:{'APPLE': 10, 'BANANA': 20, 'ORANGE': 15}
五、多层嵌套/复杂实战案例(工作常用)
案例8:嵌套列表转字典
需求:二维列表,转为标准字典
data_list = [["姓名", "小李"], ["职位", "程序员"], ["薪资", 8000]]
dic = {item[0]: item[1] for item in data_list}
print(dic)
# 输出:{'姓名': '小李', '职位': '程序员', '薪资': 8000}
案例9:多条件组合筛选
需求:筛选薪资大于7000 且 职位是程序员的员工
staff = {
"员工A": {"job": "程序员", "salary": 7500},
"员工B": {"job": "运营", "salary": 6000},
"员工C": {"job": "程序员", "salary": 8500}
}
res = {k: v for k, v in staff.items() if v["job"] == "程序员"and v["salary"] > 7000}
print(res)
# 输出:{'员工A': {'job': '程序员', 'salary': 7500}, '员工C': {'job': '程序员', 'salary': 8500}}
案例10:去重并统计元素出现次数
简易词频统计(入门版)
words = ["python", "java", "python", "go", "java", "python"]
# 遍历去重,统计次数
word_count = {w: words.count(w) for w in set(words)}
print(word_count)
# 输出:{'python': 3, 'java': 2, 'go': 1}
六、易错点提醒(避坑指南)
- 键必须不可变列表、字典不能做字典的键,会直接报错,优先使用字符串、数字、元组。
- 键重复会覆盖推导式中如果生成相同键,后面的键值会覆盖前面的数据。
- 键值互换慎用原字典值重复时,互换后会丢失数据,提前检查数据。
- 不要过度嵌套推导式追求简洁,多层嵌套会降低代码可读性,复杂逻辑建议用普通循环。
七、总结
字典推导式是 Python 语法糖的核心之一,核心优势:
以上10个案例覆盖入门、筛选、转换、实战四大场景,日常写代码、数据处理、爬虫、接口开发都能直接套用。