Python 如何使用列表推导式(list comprehensions)?

news2024/9/25 7:21:31

列表推导式(List Comprehensions)是 Python 中一种简洁且强大的创建列表的方式。通过使用列表推导式,可以用一行代码来生成列表,而不是通过多行代码的循环或其他方法。

一、列表推导式的基本语法

列表推导式的基本语法如下:

[expression for item in iterable if condition]
  • expression: 每次迭代时计算的表达式,可以是任意合法的 Python 表达式。
  • item: 当前迭代的元素。
  • iterable: 任何可迭代的对象,例如列表、元组、字符串等。
  • condition: 可选的条件表达式,只有当条件为 True 时,才会将 expression 计算的结果添加到列表中。
1.1 基本示例

将一个列表中的每个元素乘以 2:

numbers = [1, 2, 3, 4, 5]
doubled = [x * 2 for x in numbers]
print(doubled)  # 输出: [2, 4, 6, 8, 10]
1.2 带条件的列表推导式

仅保留偶数并将其平方:

numbers = [1, 2, 3, 4, 5]
squared_evens = [x ** 2 for x in numbers if x % 2 == 0]
print(squared_evens)  # 输出: [4, 16]

二、嵌套列表推导式

列表推导式可以嵌套,用于处理多维列表(如矩阵)或生成笛卡尔积。

2.1 处理多维列表

将一个二维列表(矩阵)展平为一维列表:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
flattened = [num for row in matrix for num in row]
print(flattened)  # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
2.2 生成笛卡尔积

生成两个列表的笛卡尔积:

colors = ['red', 'green', 'blue']
sizes = ['S', 'M', 'L']
cartesian_product = [(color, size) for color in colors for size in sizes]
print(cartesian_product)
# 输出: [('red', 'S'), ('red', 'M'), ('red', 'L'), ('green', 'S'), ('green', 'M'), ('green', 'L'), ('blue', 'S'), ('blue', 'M'), ('blue', 'L')]

三、列表推导式的高级用法

3.1 使用函数和复杂表达式

在列表推导式中使用函数和更复杂的表达式:

def square(x):
    return x * x

numbers = [1, 2, 3, 4, 5]
squared_numbers = [square(x) for x in numbers]
print(squared_numbers)  # 输出: [1, 4, 9, 16, 25]
3.2 条件表达式(if-else)

在列表推导式中使用条件表达式:

numbers = [1, 2, 3, 4, 5]
parity = ['even' if x % 2 == 0 else 'odd' for x in numbers]
print(parity)  # 输出: ['odd', 'even', 'odd', 'even', 'odd']

四、列表推导式的性能优化

列表推导式不仅使代码更简洁,还可以提升性能。其性能通常优于显式循环,因为列表推导式在底层进行了优化。

4.1 对比显式循环

显式循环与列表推导式的性能对比:

import time

# 显式循环
start_time = time.time()
numbers = [x for x in range(1000000)]
squared_numbers_loop = []
for x in numbers:
    squared_numbers_loop.append(x ** 2)
end_time = time.time()
print("显式循环耗时:", end_time - start_time)

# 列表推导式
start_time = time.time()
squared_numbers_lc = [x ** 2 for x in numbers]
end_time = time.time()
print("列表推导式耗时:", end_time - start_time)
4.2 避免不必要的计算

在列表推导式中避免不必要的计算:

# 低效的列表推导式
low_efficiency = [x + y for x in range(10) for y in range(10)]

# 高效的列表推导式
high_efficiency = [x + y for x in range(10) for y in range(x, 10)]

五、实际应用案例

5.1 数据清洗

列表推导式在数据清洗中的应用:

data = ["  apple  ", "banana", "  cherry", "date  "]
cleaned_data = [item.strip() for item in data]
print(cleaned_data)  # 输出: ['apple', 'banana', 'cherry', 'date']
5.2 文件处理

列表推导式在文件处理中的应用:

# 读取文件并提取每行的长度
with open('example.txt', 'r') as file:
    line_lengths = [len(line) for line in file]
print(line_lengths)
5.3 多重条件过滤

列表推导式在多重条件过滤中的应用:

numbers = range(100)
filtered_numbers = [x for x in numbers if x % 2 == 0 and x % 3 == 0]
print(filtered_numbers)  # 输出: [0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
5.4 生成字典和集合

除了生成列表,推导式还可以生成字典和集合:

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

# 集合推导式
unique_squares = {x**2 for x in numbers}
print(unique_squares)  # 输出: {0, 1, 4, 9, 16}

六、常见误区与注意事项

6.1 过度使用列表推导式

虽然列表推导式非常方便,但过度使用可能会导致代码可读性降低。对于过于复杂的逻辑,显式循环可能更清晰。

# 过于复杂的列表推导式
complex_list_comp = [x**2 for x in range(10) if x % 2 == 0 for y in range(x) if y % 2 == 1]

# 更清晰的显式循环
result = []
for x in range(10):
    if x % 2 == 0:
        for y in range(x):
            if y % 2 == 1:
                result.append(x**2)
6.2 忽略生成器表达式

当处理大量数据时,生成器表达式可以节省内存:

# 列表推导式(占用较多内存)
squared_numbers = [x**2 for x in range(1000000)]

# 生成器表达式(节省内存)
squared_numbers_gen = (x**2 for x in range(1000000))

Python 的列表推导式是一种强大且简洁的创建列表的方法。通过使用列表推导式,可以用简洁的语法实现复杂的列表生成逻辑,同时提升代码的可读性和执行效率。本文详细讲解了列表推导式的基本语法、嵌套用法、高级用法、性能优化、实际应用案例以及常见误区和注意事项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT开发笔记:信号和槽

乱码问题: 出现乱码问题原因只有一个:就是编码方式不匹配!!! 中文常见汉字4K,算上各种生僻字差不多六万字 仍然使用一个大表格,给每个汉字,分配一个整数即可。 字符集~~表示汉字的字符集&#…

基于若依的ruoyi-nbcio流程管理系统修正自定义业务表单的回写bug

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

差异分析的结果各种热图,火山图,箱式图可视化作图教程

1. 基因表达的热图绘制 1.1 根据所有差异基因绘制基因表达的聚类热图 视频教程: https://www.bilibili.com/video/BV13m421g7wv/ 1.2 绘制top差异基因表达的聚类热图 视频教程: https://www.bilibili.com/video/BV1jZ42147KP/ 1.3 绘制感兴趣基因的聚类热图 视频教程: http…

一招教你选出独立站爆品

独立站选品其实是让很多卖家感到头大的问题,明明选了一个在其他平台是爆款的品,放到独立站上就是卖不起量,有自己想卖的产品却找不到好的供应商。对于这些问题,主要还是因为在选品时照搬电商平台的选品思路,没有认清自…

2024年中级消防设施操作员(考前冲刺)证考试题库及中级消防设施操作员(考前冲刺)试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年中级消防设施操作员(考前冲刺)证考试题库及中级消防设施操作员(考前冲刺)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作…

5个超牛的Java开源OA项目(强烈推荐)

1. O2OA ——开源地址:https://gitee.com/o2oa/O2OA 概述: O2OA 是一款真正全代码(包含服务器、安卓以及IOS客户端)开源的企业应用定制化开发平台,适用于企业OA、协同办公类信息化系统的建设和开发。技术:…

HarmonyOS 开发者联盟高级认证最新题库

本篇文章包含 Next 版本更新后高级认证题库中95%的题目。 答案正确率 50-60%,答案仅做参考。 请在考试前重点看一遍题目,勿要盲目抄答案。 欢迎在评论留言正确答案和未整理的题目。 1、下面关于方舟字节码格式PREF_IMM16_v8_v8描述正确的是 16位前缀操作…

【wyTest自动化测试】快照校验模式的创新实践

本文将以遥遥领先的【华为商城】web端自动化为例,进行测试脚本开发的讲解。仅用于教学指导使用,如有侵权,请联系我删除。 一、测试脚本结构 按照教程惯例,开篇先展示一下测试脚本的标准结构模版: case_xx特性_xx001.py class Cas…

挖矿宝藏之硬盘分区

目录 一、硬盘分区的相关知识 二、主分区、活动分区、扩展分区、逻辑盘和盘符 三、硬盘分区原因 1.减少硬盘空间的浪费 2.便于文件的分类管理 3.有利于病毒的防治 四、硬盘分区的原则 1.方便性 2.实用性 3.安全性 五、利用Diskpart进行分区 1.命令行工具Diskpart …

信创学习笔记(四),信创之数据库DB思维导图

创作不易 只因热爱!! 热衷分享,一起成长! “你的鼓励就是我努力付出的动力” 一. 信创学习回顾 1.信创内容 信创内容思维导图 2.信创之CPU芯片架构 信创之CPU芯片架构思维导图 3.信创之操作系统OS 信创之操作系统OS思维导图 二. 信创之国产数据库DB思维导图 …

# Redis 入门到精通(六)-- redis 事务

Redis 入门到精通(六)-- redis 事务 一、redis 事务–redis事务简介 1、Redis 执行指令过程中,多条连续执行的指令被干扰,打断,插队,就会造成结果偏差。 2、什么是 redis 事务? redis 事务&…

关于Ubuntu22.04中的Command ‘vim‘ not found, but can be installed with:

前言 在Ubuntu终端编辑文本内容时需要利用vim,但新安装的虚拟机中并未配置vim,本文记录了vim的安装过程。 打开终端后,在home目录中输入 vim test.txt但提示报错,提示我们没有找到vim,需要通过以下命令进行安装&…

探索Python应用领域|Python有多强大?高效又实用!

Python是一种广泛使用的解释型、高级的和通用的编程语言,它拥有动态类型系统和垃圾回收机制,能够自动管理内存的使用,并且其本身具有简洁性、易读性的特点以及拥有一个巨大而广泛的标准库,功能强大适合各种应用场景和项目开发的需…

AI基于大模型语言存在的网络安全风险

目的: 随着大语言模型(LLM)各领域的广泛应用,我们迫切需要了解其中潜在的风险和威胁,及时进行有效的防御。 申明: AI技术的普及正当的使用大模型技术带来的便利,切勿使用与非法用途&#xff…

GPU云服务器------2秒文生图

GPU云服务器------2秒文生图 GPU云服务器AIGC来也开通GPU服务配置安全组规则远程连接GPU云服务器配置nginx用户文生图开启AiaccTorch禁用AiaccTorch切换模型使用LoRA插件使用Controlnet插件 服务器监控实例释放 好消息!好消息!阿里云服务器ECS推出了GPU云…

SSH讲解(重点:CentOS7)

第一章:SSH服务 1.1 SSH是什么? SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令…

DP(5) | 完全背包 | Java | 卡码52, LeetCode 518, 377, 70 做题总结

完全背包 感觉越写越糊涂了&#xff0c;初始化怎么做的&#xff1f;递推公式怎么来的&#xff1f; 状态变量 初始化 f[0][0] 0代码 这里的 f[i][j] f[i][j-w[i]]&#xff0c;就是和0-1背包最大的不同 for(int i1; i<n; i) { //物品ifor(int j1; j<m; j) {if(j<w[…

Kotlin中Unit、Any和Nothing

Unit Unit是一个特殊的类型&#xff0c;它表示“没有意义的值”的单元类型。在Kotlin中&#xff0c;当你不需要函数返回任何具体值时&#xff0c;可以使用Unit类型。 和Java 中 void一样。 Any 所有非空类的父类 Any?所有类的父类 类似Java中Object Nothing 表示一个函数或…

python的日期和时间

时间与日期 基础知识&#xff08;python的时间表示方法&#xff09; 时间戳 时间戳是一个用于表示特定时间点的方式&#xff0c;它表示自1970年1月1日00:00:00 UTC&#xff08;协调世界时&#xff09;以来经过的秒数。时间戳通常用于编程中&#xff0c;因为它提供了一种简单的方…

运维-Docker-黑马

运维-Docker-黑马 编辑时间&#xff1a;2024/7/15 来源&#xff1a;黑马程序员 docker&#xff1a;快速构建&#xff0c;运行&#xff0c;管理应用的工具 Docker安装 部署mysql 命令解读