惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
S
Security @ Cisco Blogs
S
Secure Thoughts
Attack and Defense Labs
Attack and Defense Labs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hacker News: Front Page
博客园 - 叶小钗
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog
Forbes - Security
Forbes - Security
AI
AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
GbyAI
GbyAI
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
D
DataBreaches.Net
Recent Announcements
Recent Announcements
Schneier on Security
Schneier on Security
C
Cisco Blogs
美团技术团队
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
月光博客
月光博客
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
Arctic Wolf
B
Blog RSS Feed
Cisco Talos Blog
Cisco Talos Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
G
GRAHAM CLULEY
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News

博客园 - 箫笛

Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 shell 编程 - shell 脚本的交互方式 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程 Python 编程 - 元组(tuple) Python 编程 - 字符串(str) Python 编程 - 字典(dict) Python 编程 - 列表(list) Python 编程 - 数据类型和数据结构 Python 编程 - 语句 Python 编程 - 函数 windows - WSL 的安装与使用 shell编程 - dialog 程序使用指南 FE Team - 如何做好前端代码审查 git 提交的撤销和恢复 React15 - redux-saga 如何在saga中实现轮询接口调用? React15 - React CSS Modules BEM命名实践 React15 - React 15 中 componentWillReceiveProps 为什么会多次调用, 同时componentDidUpdate 也会多次调用? React15 - React15类组件多次执行render方法的原因? React15 - React15应用中代码逻辑复用方案 React15 - React状态同步问题解决 React15 - React 15 中 React.pureComponent 的使用场景 React15 - React 15应用在页面渲染时会多次执行类组件的render 函数的原因 React15 - React 15 中能用 componetDidUpdate 代替 componentWillReceiveProps 吗? React15 - React 15 生命周期函数详解 React15 - 如何在React 15中实现自定义的事件订阅与发送(例如组件间通信) React15 - React15应用中的事件订阅和发送机制 React15 - CSS中的BEM规范 React15 - React CSS Modules BEM命名实践 React15 - 写sass 样式文件,嵌套的结构好,还是扁平的结构好? React15 - sass 中 @mixin 和 @extend 的区别是什么? React15 - React 15 应用 如何使用Css moudules 方式进行模块化开发 React15 - React15应用Sass使用指南 React15 - React 15 应用如何进行性能优化?
Python 编程 - 列表推导式
箫笛 · 2026-06-21 · via 博客园 - 箫笛

Python 3 中的列表推导式(List Comprehension)是一种简洁、优雅的构造列表的方式,它允许你通过对序列中的元素应用表达式,并可选地添加条件过滤,来快速生成新列表。相比传统的 for 循环,列表推导式不仅代码更精简,而且通常执行效率更高。


1. 基本语法

[expression for item in iterable if condition]
  • expression:对每个元素执行的表达式(可以是运算、函数调用等)。
  • item:从可迭代对象(如列表、元组、字符串、range 等)中取出的变量名。
  • iterable:任何可迭代对象。
  • if condition(可选):过滤条件,只有满足条件的元素才会被包含。

2. 基础示例

2.1 简单映射

将每个数字平方:

squares = [x**2 for x in range(10)]
print(squares)   # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2.2 带条件过滤

只取偶数平方:

even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares)   # [0, 4, 16, 36, 64]

2.3 对字符串操作

将字符串列表转为大写,并过滤掉长度小于 3 的元素:

words = ["apple", "hi", "world", "a"]
result = [w.upper() for w in words if len(w) >= 3]
print(result)   # ['APPLE', 'WORLD']

3. 嵌套循环

列表推导式可以包含多个 for 子句,相当于嵌套循环。

# 生成笛卡尔积
pairs = [(x, y) for x in [1, 2, 3] for y in ['a', 'b']]
print(pairs)
# [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b'), (3, 'a'), (3, 'b')]

相当于:

pairs = []
for x in [1, 2, 3]:
    for y in ['a', 'b']:
        pairs.append((x, y))

多重条件与多个 for

# 求两个列表中所有可能的数对,要求和为偶数
result = [(x, y) for x in [1, 2, 3] for y in [4, 5, 6] if (x + y) % 2 == 0]

4. 高级用法

4.1 条件表达式(三元运算符)在推导式中

可以在表达式中使用 if-else 来改变输出的值:

# 将偶数变为 'even',奇数变为 'odd'
labels = ['even' if x % 2 == 0 else 'odd' for x in range(5)]
print(labels)   # ['even', 'odd', 'even', 'odd', 'even']

4.2 使用 zip 同时迭代多个序列

names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
result = [f'{name}: {score}' for name, score in zip(names, scores)]
print(result)   # ['Alice: 85', 'Bob: 92', 'Charlie: 78']

4.3 获取多维列表的某个列

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
col2 = [row[1] for row in matrix]   # 第二列
print(col2)   # [2, 5, 8]

5. Python 3 中的特殊注意事项

  • 作用域:在 Python 3 中,列表推导式中的循环变量(如上面的 x)是局部作用域的,不会泄露到外部命名空间(而在 Python 2 中会)。这避免了意外的变量污染。

    x = 10
    [x**2 for x in range(3)]
    print(x)   # Python 3 输出 10,Python 2 输出 2
    
  • 内存效率:列表推导式会一次性生成完整的列表,占用内存。如果数据量很大,建议使用生成器表达式(expression for item in iterable)),它返回一个生成器,按需产出元素。


6. 与其他方式的对比

方式 代码 特点
普通 for 循环 result = []
for x in range(10):
  result.append(x**2)
可读性强,但冗长
map + filter list(map(lambda x: x**2, filter(lambda x: x%2==0, range(10)))) 函数式,但可读性较差
列表推导式 [x**2 for x in range(10) if x%2==0] 最简洁、直观,且性能通常优于 map/filter + lambda

7. 扩展:其他推导式

Python 3 还支持类似的语法用于集合({})、字典({key: value})和生成器(()):

# 集合推导式
s = {x**2 for x in range(5)}   # {0, 1, 4, 9, 16}

# 字典推导式
d = {x: x**2 for x in range(5)}   # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 生成器表达式(不立即生成列表,惰性求值)
gen = (x**2 for x in range(5))
print(next(gen))   # 0

8. 总结

  • 列表推导式是 Python 中推荐的列表构造方式,在保持可读性的同时减少代码量。
  • 适用于简单的循环和过滤逻辑;若逻辑过于复杂(比如需要异常处理或大量嵌套),建议使用普通循环以保持清晰。
  • 在 Python 3 中,推导式的变量是局部作用域,更安全。
  • 当数据量大时,优先考虑生成器表达式以节省内存。