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'}

三、切片与推导式使用原则

  1. 推导式虽简洁,但避免嵌套过深(超过2层),否则可读性下降,建议拆分为普通循环。
  2. 切片适合批量截取/修改序列数据,推导式适合基于现有数据生成新容器。
  3. 推导式比普通for循环执行效率更高(底层优化),但大数据量处理时需注意内存占用(可改用生成器表达式(x for x in ...))。
posted @ 2026-01-14 22:33  小帅记事  阅读(3)  评论(0)    收藏  举报