Python容器切片与推导式,列表/字典/集合实战
在Python编程中,切片和推导式是提升容器(列表、字典、集合)操作效率的核心技巧,掌握它们能大幅简化代码、提升可读性。本文从实战角度拆解切片的灵活用法,以及列表、字典、集合推导式的编写逻辑,适合Python入门到进阶学习者掌握。
一、容器切片:快速截取容器核心数据
切片是Python序列类型(列表、元组、字符串)的通用操作,语法为[起始索引:结束索引:步长],核心规则是“左闭右开”(包含起始索引,不包含结束索引),索引支持正数(从左到右)和负数(从右到左,-1代表最后一个元素)。
1. 列表切片基础用法
# 基础切片:截取索引1到3(不含3)的元素
nums = [1, 2, 3, 4, 5]
print(nums[1:3]) # 输出:[2, 3]
# 省略起始/结束索引:默认从开头/到末尾
print(nums[:3]) # 输出:[1, 2, 3](从开头到索引3)
print(nums[2:]) # 输出:[3, 4, 5](从索引2到末尾)
# 负数索引:从右往左取
print(nums[-3:-1]) # 输出:[3, 4](倒数第3到倒数第2)
# 步长切片:隔n个取一个,步长为负则反向截取
print(nums[::2]) # 输出:[1, 3, 5](步长2,从头取到尾)
print(nums[::-1]) # 输出:[5, 4, 3, 2, 1](步长-1,反转列表)
2. 切片注意事项
- 切片不会修改原容器,而是返回新的序列;若需修改原列表,可通过切片赋值(如
nums[1:3] = [8,9])。 - 索引超出范围不会报错,会自动取到容器边界(如
nums[10:20]返回空列表)。
二、推导式:极简写法生成容器
推导式是Python特有的简洁语法,能通过一行代码基于可迭代对象(列表、元组、字典、range等)生成新容器,替代繁琐的for循环+append操作,核心优势是简洁、高效。
1. 列表推导式:最常用的推导式
语法:[表达式 for 变量 in 可迭代对象 if 条件],先遍历可迭代对象,满足条件则执行表达式,最终生成列表。
基础示例
# 生成1-10的偶数列表(替代for+append)
even_nums = [x for x in range(1,11) if x % 2 == 0]
print(even_nums) # 输出:[2, 4, 6, 8, 10]
# 嵌套循环推导式:生成二维列表扁平化结果
matrix = [[1,2], [3,4], [5,6]]
flat_matrix = [num for row in matrix for num in row]
print(flat_matrix) # 输出:[1, 2, 3, 4, 5, 6]
实用场景
- 数据清洗:过滤列表中的空值/无效值(如
[s.strip() for s in str_list if s and s.strip()])。 - 数据转换:将列表元素统一格式(如
[float(x) for x in num_str_list])。
2. 字典推导式:快速构建字典
语法:{键表达式: 值表达式 for 变量 in 可迭代对象 if 条件},核心是同时生成键和值。
基础示例
# 生成数字到平方的映射字典
square_dict = {x: x*x for x in range(1,6)}
print(square_dict) # 输出:{1:1, 2:4, 3:9, 4:16, 5:25}
# 筛选字典:保留值大于10的键值对
origin_dict = {"a":5, "b":12, "c":15, "d":8}
filter_dict = {k:v for k,v in origin_dict.items() if v > 10}
print(filter_dict) # 输出:{'b': 12, 'c': 15}
3. 集合推导式:自动去重生成集合
语法:{表达式 for 变量 in 可迭代对象 if 条件},与列表推导式类似,但返回集合(无序、无重复)。
基础示例
# 生成列表去重后的平方集合
nums = [1,2,2,3,3,3]
square_set = {x*x for x in nums}
print(square_set) # 输出:{1, 4, 9}(自动去重)
# 筛选字符串中长度大于3的字符集合
strs = ["apple", "banana", "pear", "grape"]
long_str_set = {s for s in strs if len(s) > 3}
print(long_str_set) # 输出:{'apple', 'banana', 'grape'}
三、切片与推导式使用原则
- 推导式虽简洁,但避免嵌套过深(超过2层),否则可读性下降,建议拆分为普通循环。
- 切片适合批量截取/修改序列数据,推导式适合基于现有数据生成新容器。
- 推导式比普通for循环执行效率更高(底层优化),但大数据量处理时需注意内存占用(可改用生成器表达式
(x for x in ...))。

浙公网安备 33010602011771号