当前位置: 首页 > news >正文

列表推导式详解与实战应用

Python推导式全面详解

一、推导式概述

Python推导式(Comprehension)是一种简洁、高效的语法结构,用于从一个可迭代对象快速创建新的数据结构。推导式不仅使代码更加简洁易读,还能提高代码执行效率。Python支持四种主要的推导式:列表推导式、字典推导式、集合推导式和生成器推导式(通常称为生成器表达式)。

推导式的基本优势:

  • 代码简洁性:用一行代码替代多行循环
  • 执行效率:通常比传统循环更快
  • 可读性:直观表达数据转换逻辑
  • 内存优化:生成器推导式支持惰性求值

二、列表推导式

基本语法结构

[expression for item in iterable if condition]

基础用法示例

# 传统方式创建平方数列表 squares_old = [] for i in range(1, 6): squares_old.append(i ** 2) # 使用列表推导式 squares = [i ** 2 for i in range(1, 6)] print(squares) # 输出: [1, 4, 9, 16, 25]

带条件过滤的列表推导式

# 筛选偶数并计算平方 even_squares = [i ** 2 for i in range(10) if i % 2 == 0] print(even_squares) # 输出: [0, 4, 16, 36, 64] # 筛选字符串长度大于3的单词 words = ['apple', 'cat', 'banana', 'dog', 'elephant'] long_words = [word.upper() for word in words if len(word) > 3] print(long_words) # 输出: ['APPLE', 'BANANA', 'ELEPHANT']

多重循环的列表推导式

# 生成坐标点 coordinates = [(x, y) for x in range(3) for y in range(2)] print(coordinates) # 输出: [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)] # 矩阵转置示例 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] transposed = [[row[i] for row in matrix] for i in range(3)] print(transposed) # 输出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

三、字典推导式

基本语法结构

{key_expression: value_expression for item in iterable if condition}

基础字典推导式示例

# 创建数字与其平方的字典 squares_dict = {x: x**2 for x in range(1, 6)} print(squares_dict) # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} # 转换列表为字典 fruits = ['apple', 'banana', 'cherry'] fruit_dict = {fruit: len(fruit) for fruit in fruits} print(fruit_dict) # 输出: {'apple': 5, 'banana': 6, 'cherry': 6}

带条件过滤的字典推导式

# 筛选值大于10的项 original_dict = {'a': 5, 'b': 15, 'c': 8, 'd': 20} filtered_dict = {k: v for k, v in original_dict.items() if v > 10} print(filtered_dict) # 输出: {'b': 15, 'd': 20} # 键值交换并过滤 inverted_dict = {v: k for k, v in original_dict.items() if v % 2 == 0} print(inverted_dict) # 输出: {8: 'c', 20: 'd'}

使用zip函数的字典推导式

# 合并两个列表为字典 keys = ['name', 'age', 'city'] values = ['Alice', 25, 'New York'] person_dict = {k: v for k, v in zip(keys, values)} print(person_dict) # 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}

四、集合推导式

基本语法结构

{expression for item in iterable if condition}

基础集合推导式示例

# 创建唯一平方数的集合 unique_squares = {x**2 for x in [1, 2, 2, 3, 3, 3, 4]} print(unique_squares) # 输出: {16, 1, 4, 9} # 从字符串中提取唯一字符 text = "hello world" unique_chars = {char for char in text if char != ' '} print(unique_chars) # 输出: {'h', 'e', 'l', 'o', 'w', 'r', 'd'}

带条件过滤的集合推导式

# 筛选长度大于3的单词 words = {'apple', 'cat', 'banana', 'dog', 'elephant'} long_words_set = {word for word in words if len(word) > 3} print(long_words_set) # 输出: {'banana', 'apple', 'elephant'} # 数学运算后的集合 numbers = {1, 2, 3, 4, 5} doubled_evens = {x*2 for x in numbers if x % 2 == 0} print(doubled_evens) # 输出: {4, 8}

五、生成器推导式

基本语法结构

(expression for item in iterable if condition)

生成器推导式示例

# 创建生成器推导式 squares_gen = (x**2 for x in range(1, 6)) print(squares_gen) # 输出: <generator object <genexpr> at 0x...> # 使用生成器 for square in squares_gen: print(square, end=' ') # 输出: 1 4 9 16 25 # 带条件的生成器 even_squares_gen = (x**2 for x in range(10) if x % 2 == 0) print(list(even_squares_gen)) # 输出: [0, 4, 16, 36, 64]

生成器的内存优势

# 处理大数据集时的内存对比 import sys # 列表推导式 - 立即计算所有结果 big_list = [x**2 for x in range(1000000)] print(f"列表内存占用: {sys.getsizeof(big_list)} 字节") # 较大内存占用 # 生成器推导式 - 惰性计算 big_gen = (x**2 for x in range(1000000)) print(f"生成器内存占用: {sys.getsizeof(big_gen)} 字节") # 较小内存占用

六、元组推导式

注意:Python中没有真正的元组推导式语法,但可以使用生成器推导式配合tuple()函数实现类似功能。

# 使用生成器推导式创建元组 squares_tuple = tuple(x**2 for x in range(1, 6)) print(squares_tuple) # 输出: (1, 4, 9, 16, 25) # 带条件的元组"推导式" even_tuple = tuple(x for x in range(10) if x % 2 == 0) print(even_tuple) # 输出: (0, 2, 4, 6, 8)

七、复杂推导式应用

嵌套推导式

# 创建二维列表 matrix_2d = [[i*j for j in range(1, 4)] for i in range(1, 4)] print(matrix_2d) # 输出: [[1, 2, 3], [2, 4, 6], [3, 6, 9]] # 展平嵌套列表 nested_list = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] flattened = [item for sublist in nested_list for item in sublist] print(flattened) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

推导式中的三元表达式

# 使用三元运算符的推导式 numbers = [1, -2, 3, -4, 5] absolute_values = [x if x >= 0 else -x for x in numbers] print(absolute_values) # 输出: [1, 2, 3, 4, 5] # 字典推导式中的复杂逻辑 scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78, 'Diana': 95} grade_dict = {name: 'A' if score >= 90 else 'B' if score >= 80 else 'C' for name, score in scores.items()} print(grade_dict) # 输出: {'Alice': 'B', 'Bob': 'A', 'Charlie': 'C', 'Diana': 'A'}

八、推导式性能对比

执行效率比较

import time # 传统for循环 start_time = time.time() result_old = [] for i in range(1000000): if i % 2 == 0: result_old.append(i**2) end_time = time.time() print(f"传统循环耗时: {end_time - start_time:.4f}秒") # 列表推导式 start_time = time.time() result_new = [i**2 for i in range(1000000) if i % 2 == 0] end_time = time.time() print(f"推导式耗时: {end_time - start_time:.4f}秒")

九、最佳实践与注意事项

推导式使用建议

场景推荐推导式类型说明
需要有序数据列表推导式保持元素顺序
需要键值对字典推导式快速构建映射关系
需要去重集合推导式自动去除重复元素
大数据处理生成器推导式节省内存,惰性求值
复杂逻辑传统循环可读性更好

常见注意事项

  1. 避免过度复杂:当推导式变得难以理解时,应考虑使用传统循环
  2. 注意变量作用域:推导式中的变量会泄漏到外部作用域
  3. 内存考虑:列表推导式会立即创建完整列表,可能消耗大量内存
  4. 错误处理:推导式中难以添加异常处理逻辑

通过掌握这些推导式的使用方法,你可以编写出更加简洁、高效的Python代码,显著提升开发效率和代码质量。


参考来源

  • python列表推导式、字典推导式、集合推导式
  • 【Python】推导式(列表推导式、元组推导式、字典推导式、集合推导式)详解
  • 【技能树共建】Python 列表推导式
  • 列表推导式与字典推导式,滚雪球学 Python
  • PYTHON-列表推导式
  • python 列表推导式、元组推导式 字典推导式 、三元运算符
http://www.jsqmd.com/news/497650/

相关文章:

  • 基于springboot“茶见”在线商城设计与开发(源码+精品论文+答辩PPT等资料)
  • 第 18 篇 综合项目实战:基于 RK3568 的安卓智能门禁系统,全栈开发
  • 《我从达尔文那里学到的投资知识》
  • 力扣 hot100 滑动窗口最大值 单调双端队列 java 简单题解
  • 金融交易系统高可用测试指南:构建永不宕机的安全防线
  • SGI备份还原单文件版
  • 天地图中使用html2canvas问题
  • Zen Browser:基于 Firefox 的极简开源浏览器,隐私与速度兼得
  • Linux系统文件操作简介
  • OpenClaw 核心功能解析:一文让你彻底搞懂 OpenClaw
  • Win 32 API:初步了解与应用
  • 2026年SCI论文降AI率用什么工具?实测5款后选了这个
  • 4K型护套连接器ZE0703-09(250)参数
  • hello-agent task01打卡
  • PDF文件拆分, 不限制文件大小
  • 携程任我行礼品卡回收秒变现攻略 - 京顺回收
  • 任务栏标语图片
  • 加一 - 题目笔记
  • MySQL主键设计原则与自增ID的潜在问题分析
  • 自动化测试常用函数(元素的定位)
  • 技术分享-日志链路追踪
  • 龙虾智能体不是玩具!国家安全部提醒:这3个防护步骤必做
  • (独自升级Lv.1)C++基础面试题
  • 从零学网安第四期--在kali里面制作木马程序并实现远程控制
  • 238. 除了自身以外数组的乘积
  • 自动驾驶购物车测试:超市里的交通拥堵难题——软件测试工程师的实战解构
  • 《MySQL数据库基础》4. 数据类型
  • 别再花冤枉钱了!强推10款国内免费降AI神器,一键破解论文AIGC难题(附传送门)
  • 基于Vue.js的实验室耗材管理系统设计与实现 毕业设计源码+论文+PPT
  • 基础 语法