Python 基础:列表的切片与嵌套列表使用技巧

彻底搞懂 Python 列表推导式的语法结构、执行顺序、条件筛选、嵌套推导,掌握如何用一行代码替代多行 for 循环,学会日常开发高频写法、性能优势以及新手常见坑,大幅精简你的代码。

一、什么是列表推导式

1.1 定义

列表推导式(List Comprehension)是 Python 独有的简洁、高效、声明式创建列表的语法。

可以一行代码替代 3~5 行 for 循环代码,用于快速实现:

  • 数据生成
  • 数据筛选
  • 数据运算转换
  • 嵌套列表扁平化

1.2 为什么要用列表推导式

1.代码量极少,简洁优雅 2. 底层 C 实现,性能远高于普通 for 循环 3.可读性高、逻辑清晰 4. 数据分析、爬虫、算法必备

1.3 通用语法格式

python 复制代码
# 基础语法
[表达式 for 变量 in 可迭代对象]

# 带条件筛选(常用)
[表达式 for 变量 in 可迭代对象 if 条件]

# 多循环/嵌套推导
[表达式 for x in A for y in B]

二、基础实战:替代普通 for 循环

2.1 传统 for 循环写法

生成 1~10 的平方列表:

python 复制代码
# 传统写法
res = []
for i in range(1, 11):
    res.append(i ** 2)

print(res)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

2.2 列表推导式一行搞定

python 复制代码
# 推导式写法
res = [i ** 2 for i in range(1, 11)]
print(res)

效果完全一致,代码直接精简 4 行!

三、条件筛选推导(高频)

需求:只保留 1~10 中的偶数并平方

3.1 传统写法

python 复制代码
res = []
for i in range(1, 11):
    if i % 2 == 0:
        res.append(i ** 2)

print(res)
# [4, 16, 36, 64, 100]

3.2 带 if 推导式

python 复制代码
res = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(res)

非常适合数据清洗、筛选数据!

四、带 if-else 多条件推导

语法:条件写在前面

需求:偶数不变,奇数置为 0

python 复制代码
res = [i if i % 2 == 0 else 0 for i in range(1, 11)]
print(res)
# [0, 2, 0, 4, 0, 6, 0, 8, 0, 10]

口诀:

  • 只有 if:放后面(过滤元素)
  • if else:放前面(修改元素)

五、嵌套列表推导(双层循环)

需求:将双层嵌套列表扁平化

5.1 原始数据

python 复制代码
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

5.2 传统双层循环

python 复制代码
res = []
for sub in data:
    for num in sub:
        res.append(num)

print(res)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

5.3 嵌套列表推导式

python 复制代码
res = [num for sub in data for num in sub]
print(res)

瞬间扁平化多维列表,爬虫、数据处理超级好用!

六、进阶实战案例(工作常用)

案例 1:筛选学生高分数据

python 复制代码
students = [("张三", 88), ("李四", 59), ("王五", 95), ("赵六", 92)]

# 筛选 90 分以上学生
high = [name for name, score in students if score >= 90]
print(high)
# ['王五', '赵六']

案例 2:批量字符串处理

python 复制代码
words = ["python", "java", "c++", "go"]

# 全部转为大写
upper_words = [w.upper() for w in words]
print(upper_words)
# ['PYTHON', 'JAVA', 'C++', 'GO']

案例 3:筛选有效数据(去除空值)

python 复制代码
data = ["hello", "", None, "python", "", "csdn"]
valid = [x for x in data if x]
print(valid)
# ['hello', 'python', 'csdn']

七、性能对比:for 循环 vs 列表推导式

表格

方式 代码量 运行速度 可读性
普通 for + append 多 慢 一般
列表推导式 极少 提升 2~3 倍 优秀

原因: 列表推导式是底层 C 语言循环,不需要频繁调用 append 方法,开销极小。

八、新手高频坑点(避坑指南)

坑点 1:多层循环顺序写反

python 复制代码
data = [[1,2],[3,4]]
# 正确
res = [n for s in data for n in s]

# 写反直接报错!
# res = [n for n in s for s in data]

记忆:外层循环写前面,内层循环写后面

坑点 2:if、if-else 位置混淆

  • 过滤元素:if 放末尾
  • 修改元素:if-else 放前面

坑点 3:推导式嵌套过多

超过三层循环不建议使用推导式,可读性极差,优先普通循环。

相关推荐
张张123y4 小时前
后端第一课:输入 URL 后发生了什么?我用手写 Socket 把全链路跑通了
python·websocket·ai·socket·url·后端开发
白帽攻防录6 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛6 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
全栈弄潮儿6 小时前
Python实战第7期:字典与集合
后端·python·编程语言
2603_965148116 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya7 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
把我格子衫拿来7 小时前
Dice 很高就够了吗?分割评价中的 IoU、表面距离与 HD95
python·图像分割·模型评估·医学影像·dice
学逆向的7 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
曲径海盗8 小时前
【Python 学习第 31 天】复习:变量与数据类型 等 3 题
python·学习笔记·编程入门
Data_Journal8 小时前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python