23 python 数据容器推导式
在办公室里,一群牛马经常需要批量处理任务:
- 从员工名单中筛选符合条件的候选人
- 把 Excel 表格数据转换成字典格式
- 自动生成会议纪要的结构化数据
一、推导式定义
Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
Python 推导式就像职场中的 "批量处理神器",能在一行代码内完成数据转换和筛选
Python 支持各种数据结构的推导式:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
- 元组(tuple)推导式
其基本格式都为表达式 for 变量 in 数据容器 if 条件
二、列表推导式
语法:[表达式 for 变量 in 列表]
或:[表达式 for 变量 in 列表 if 条件]
场景:从候选人名单中筛选出符合条件的面试者
# 传统循环写法
candidates = ['张三', '李四喜', '王五佰', '赵六']
qualified = []
for name in candidates:if len(name) >= 3: # 假设名字长度达标qualified.append(name) # 统一到一起
print(qualified)# 推导式写法
qualified = [name for name in candidates if len(name) >= 3]
print(qualified)
# ['李四喜', '王五佰']
# ['李四喜', '王五佰']
对比:推导式将 4 行代码浓缩为 1 行,且执行效率更高。
可以手动试试统计一下分别执行了多长时间
三、字典推导式
语法:{ key_expr: value_expr for value in collection }
或: { key_expr: value_expr for value in collection if condition }
场景:将 Excel 中的员工编号和姓名转换为字典
# 传统写法
id_list = [1001, 1002, 1003]
name_list = ['豆包', '小明', '小红']
emp_dict = {}
for i in range(len(id_list)):emp_dict[id_list[i]] = name_list[i]
print(emp_dict)# 推导式写法
emp_dict = {id: name for id, name in zip(id_list, name_list)}
print(emp_dict)
# {1001: '豆包', 1002: '小明', 1003: '小红'}
# {1001: '豆包', 1002: '小明', 1003: '小红'}
优势:直接将两个列表合并为字典,代码量减少 50%。
四、集合推导式
语法:{ expression for item in Sequence }
或 { expression for item in Sequence if conditional }
场景:从招聘数据中提取所有不重复的岗位
# 传统写法
positions = ['Python开发', '测试工程师', 'Python开发', '产品经理']
unique_positions = set()
for pos in positions:unique_positions.add(pos.split(' ')[0]) # 提取岗位名称# 推导式写法
unique_positions = {pos.split(' ')[0] for pos in positions}
效果:自动去重并提取核心岗位名称。
五、元组推导式
语法:(expression for item in Sequence )
或:(expression for item in Sequence if conditional )
场景:生成包含日期和工作量的周报元组
# 传统写法
weekly_data = []
for day in range(1, 6):workload = day * 2 # 假设每天工作量递增weekly_data.append((f"第{day}天", workload))# 推导式写法
weekly_data = ((f"第{day}天", day * 2) for day in range(1, 6))
print(weekly_data)
# 元组推导式返回的结果是一个生成器对象。
# <generator object <genexpr> at 0x0000024109E9A9B0># 使用 tuple() 函数,可以直接将生成器对象转换成元组
print(tuple(weekly_data))
# (('第1天', 2), ('第2天', 4), ('第3天', 6), ('第4天', 8), ('第5天', 10))
注意,元组推导式返回的结果是一个生成器对象,可以使用tuple() 函数,将生成器对象转换成元组
六、注意事项
- 避免过度复杂:超过 2 层嵌套的推导式可读性下降,改用函数封装
- 性能考量:处理 10 万条以上数据时,优先使用生成器推导式
- 错误处理:添加
try...except
避免因数据格式问题导致程序崩溃
# 安全写法示例
raw_data = [' apple ', 123, ' banana', None, 'cherry ']
def validate_name(name):try:return isinstance(name, str) and len(name.strip()) >= 2except:return Falsecleaned_names = [name.strip() for name in raw_data if validate_name(name)]
print(cleaned_names)