Python推导式详细讲解

更多资料获取

📚 个人网站:ipengtao.com


在Python中,推导式是一种简洁而强大的语法特性,可以用来创建列表、集合、字典等数据结构。本文将深入探讨Python中的三种推导式:列表推导式、集合推导式和字典推导式,以及它们在不同情境下的应用。

列表推导式

列表推导式是Python中最常见的推导式,它允许我们用一行代码创建新的列表。

以下是一些实例:

# 生成1到10的平方列表
squares = [x**2 for x in range(1, 11)]# 过滤偶数,生成仅包含奇数的列表
odd_numbers = [x for x in range(1, 11) if x % 2 != 0]# 使用条件表达式生成包含奇偶性判断的列表
evenodd_label = ["Even" if x % 2 == 0 else "Odd" for x in range(1, 11)]

集合推导式

集合推导式类似于列表推导式,但生成的是集合。

以下是一些集合推导式的示例:

# 生成1到10的平方集合
squares_set = {x**2 for x in range(1, 11)}# 过滤偶数,生成仅包含奇数的集合
odd_numbers_set = {x for x in range(1, 11) if x % 2 != 0}

字典推导式

字典推导式可以用一行代码生成字典,非常适用于从其他数据结构构建字典的场景。

# 生成1到10的数字与其平方的字典
squares_dict = {x: x**2 for x in range(1, 11)}# 过滤偶数,生成仅包含奇数的字典
odd_numbers_dict = {x: "Odd" for x in range(1, 11) if x % 2 != 0}

推导式的性能

在Python中,推导式是一种优雅而简洁的语法特性,但在使用时需要注意其性能,特别是在处理大规模数据时。我们将对比推导式与传统循环在性能上的差异,并讨论何时选择使用推导式以及何时选择传统循环。

1. 推导式 vs. 传统循环

考虑以下示例,使用列表推导式和传统循环分别生成包含1到1000的平方的列表:

列表推导式:

squares = [x**2 for x in range(1, 1001)]

传统循环:

squares = []
for x in range(1, 1001):squares.append(x**2)

2. 性能比较

为了比较性能,我们可以使用Python内置的timeit模块来测量代码的执行时间。以下是一个简单的性能测试:

import timeit# 列表推导式性能测试
time_list_comprehension = timeit.timeit('[x**2 for x in range(1, 1001)]', number=1000)# 传统循环性能测试
time_for_loop = timeit.timeit("""
squares = []
for x in range(1, 1001):squares.append(x**2)
""", number=1000)print(f"列表推导式执行时间: {time_list_comprehension} 秒")
print(f"传统循环执行时间: {time_for_loop} 秒")

3. 何时选择推导式?

推导式在简化代码和提高可读性方面具有优势,但在性能上可能不总是最佳选择。推导式通常在处理简单任务和小型数据集时表现良好。当任务变得复杂或数据规模庞大时,传统循环可能更具有灵活性和控制性。

选择使用推导式的情况:

  • 任务简单,代码清晰易读。
  • 处理小型数据集,性能影响可接受。

4. 何时选择传统循环?

传统循环在处理复杂任务和大规模数据集时可能更为适用。它提供更多的灵活性和可控性,有时可以通过手动优化提高性能。

选择使用传统循环的情况:

  • 任务复杂,需要更多控制结构。
  • 处理大型数据集,性能至关重要。

嵌套推导式

嵌套推导式是Python中强大的特性之一,它允许在一个推导式内部包含另一个推导式,用于处理多维数据结构,例如二维列表或字典。本节将深入讨论嵌套推导式的用法以及在处理多维数据时的应用场景。

1. 二维列表的创建

考虑一个场景,想要创建一个5x5的九九乘法表。嵌套推导式能够以紧凑而清晰的方式实现这个任务:

multiplication_table = [[i * j for j in range(1, 6)] for i in range(1, 6)]
print(multiplication_table)

这个嵌套推导式创建了一个包含九九乘法表的二维列表,其中外层推导式负责生成每一行,内层推导式负责生成每一列的元素。这种结构使得代码易于理解且高度可读。

2. 过滤嵌套列表

嵌套推导式也可以用于过滤多维数据结构。例如,想要获取九九乘法表中所有元素值为偶数的项:

even_values = [value for row in multiplication_table for value in row if value % 2 == 0]
print(even_values)

这个例子中,通过在嵌套推导式中添加条件语句,可以轻松地筛选出符合条件的元素。

3. 字典的嵌套推导式

嵌套推导式同样适用于字典的创建和过滤。考虑一个示例,想要创建一个包含坐标点的字典,其中x和y的取值范围在1到3之间:

coordinate_dict = {(x, y): x * y for x in range(1, 4) for y in range(1, 4)}
print(coordinate_dict)

这个嵌套推导式创建了一个字典,其中包含了所有可能的坐标点及其对应的乘积。

4. 多重条件的嵌套推导式

在嵌套推导式中,可以使用多重条件来进一步筛选数据。例如,如果只想要九九乘法表中那些乘积大于10的元素:

filtered_values = [value for row in multiplication_table for value in row if value > 10]
print(filtered_values)

通过添加条件语句,我们可以方便地实现对多维数据结构的复杂过滤操作。

推导式的应用场景

推导式是Python中一项强大而灵活的语法特性,适用于各种数据处理、过滤和转换场景。以下是几个实际案例,展示推导式在不同应用场景中的优雅应用。

1. 数据初始化

在某些情况下,需要初始化一个包含特定值的列表。使用列表推导式可以使这个过程非常简洁:

# 初始化一个包含5个零的列表
zero_list = [0 for _ in range(5)]
print(zero_list)

2. 过滤与转换

假设有一个包含数字的列表,想要生成一个新列表,其中包含原列表中每个元素的平方值,但仅保留偶数的平方值:

original_list = [1, 2, 3, 4, 5]# 使用推导式过滤与转换
squares_of_evens = [x**2 for x in original_list if x % 2 == 0]
print(squares_of_evens)

3. 字典构建

字典推导式可以用于从其他数据结构构建字典。考虑一个场景,有两个列表,一个表示城市,另一个表示对应的人口数量:

cities = ['New York', 'Tokyo', 'London']
populations = [8537673, 37977073, 9304016]# 使用字典推导式构建城市与人口的字典
city_population_dict = {city: population for city, population in zip(cities, populations)}
print(city_population_dict)

4. 文件读取与处理

在处理文件时,推导式可以快速生成某些数据的列表。例如,读取一个文件中的每一行,提取所有大写单词:

with open('sample.txt', 'r') as file:uppercase_words = [word for line in file for word in line.split() if word.isupper()]
print(uppercase_words)

5. 多维数据处理

使用嵌套推导式可以轻松处理多维数据结构,例如创建一个包含矩阵转置的列表:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]# 使用嵌套推导式进行矩阵转置
transposed_matrix = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print(transposed_matrix)

总结

Python推导式是一项强大的语法特性,以其简洁而灵活的语法,广泛应用于数据处理、过滤、转换等多个场景。通过本文的详细讲解,深入了解了列表推导式、集合推导式、字典推导式以及嵌套推导式的使用方法和优势。

在实际应用中,列表推导式在数据初始化和快速过滤转换上表现出色,集合推导式适用于生成独一无二的元素集合,而字典推导式则为从不同数据结构构建字典提供了简洁的语法。嵌套推导式则在处理多维数据结构时展现出其独特优势,使得代码更为清晰和可读。

此外,还对推导式的性能进行了比较,提供了选择使用推导式或传统循环的指导。推导式在简化代码和提高可读性方面表现优越,但在处理复杂任务和大规模数据时,开发者应该谨慎选择以平衡性能和代码结构。

通过实际案例的展示,能够更好地理解何时选择使用推导式,并学会灵活运用不同类型的推导式来提高代码的简洁性和效率。在实际应用中,合理运用推导式将为Python开发者带来更高的开发效率和代码质量。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open3D 最小二乘拟合二维直线(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 平面直线的表达式为: y = k x + b

Python-炸弹人【附完整源码】

炸弹人 炸弹人是童年的一款经典电子游戏,玩家控制一个类似"炸弹人"的角色,这个角色可以放置炸弹,并在指定的时间内引爆它们消灭敌人以达到目标,此游戏共设有两节关卡,代码如下: 运行效果&#x…

二叉搜索树——模拟

对于一个无穷的满二叉排序树(如图),节点的编号是1,2,3,…。对于一棵树根为X的子树,沿着左节点一直往下到最后一层,可以获得该子树编号最小的节点;沿着右节点一直往下到最后一层,可以…

『亚马逊云科技产品测评』活动征文| 基于etcd实现服务发现

提示:授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 背景 etcd 是一个分布式 Key-Value 存储系统&#xff0…

IP地址定位不准确的情况研究

在互联网的浩瀚海洋中,每一台连接到网络的设备都被赋予了一个独特的标识符,这就是IP地址。它就像是我们在线身份的一部分,帮助我们与他人进行通信,获取信息,以及享受各种网络服务。然而,由于各种原因&#…

【LVS实战】04 LVS+Keepalived实现负载均衡高可用

一、介绍 Keepalived 是一个用于 Linux 平台的高可用性软件。它实现了虚拟路由器冗余协议 (VRRP) 和健康检查功能,可以用于确保在多台服务器之间提供服务的高可用性。Keepalived 可以检测服务器的故障,并在主服务器宕机时,自动将备份服务器提…

哈希表及其基础(java详解)

目录 一、哈希表基础 二、哈希函数的设计 哈希函数的设计原则 三、java中的hashCode 基本数据类型的hashCode使用 自定义类型的hashCode使用 需要注意 四、哈希冲突的处理 链地址法Seperate Chaining 五、实现属于我们自己的哈希表 六、哈希表的动态空间处理和复杂…

10、外观模式(Facade Pattern,不常用)

外观模式(Facade Pattern)也叫作门面模式,通过一个门面(Facade)向客户端提供一个访问系统的统一接口,客户端无须关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要…

vscode插件离线下载

离线下载插件地址:https://marketplace.visualstudio.com/VSCode

SQL server 基线安全加固操作

目录 账号管理、认证授权 ELK-Mssql-01-01-01 ELK-Mssql-01-01-02 ELK-Mssql-01-01-03 ​​​​​​​ ELK-Mssql-01-01-04 ​​​​​​​ ELK-Mssql-01-01-05 ​​​​​​​ELK-Mssql-01-01-06 日志配置 ELK-Mssql-02-01-01 通信协议 ELK-Mssql-03-01-01 ​​​​​…

【i.MX6ULL】linux驱动bh1750模块

I2C-BH1750 1、设备地址 引脚说明 VCC5VGNDGNDSCLPB6SDAPB7ADDRVCC/GND bh1750设备的地址由引脚 ADDR 来决定 ADDR接GND 当ADDR引脚接地时设备bh1750的地址为:0x23(7bit) ADDR接VCC 当ADDR引脚接地时设备bh1750的地址为:0x5c(7bit) 2、工作模式 …

基于深度学习CRNN的水表读数识别系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着科技的不断发展,深度学习技术在各个领域都取得了显著的成果。其中,基于深度学习的图像识别技术在计算机视觉领域具有重要的应用价值。…

Linux 多线程(C语言) 备查

基础 1)线程在运行态和就绪态不停的切换。 2)每个线程都有自己的栈区和寄存器 1)进程是资源分配的最小单位,线程是操作系统调度执行的最小单位 2)线程的上下文切换的速度比进程快得多 3)从应用程序A中启用应…

制作一个RISC-V的操作系统四-嵌入式开发介绍

文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1练习4-2练习4-3 什么是嵌入式开发 程序跑到开发板上,或者说运行到硬件上 交叉编译 简单理解交叉编译来说…

API自动化测试:如何构建高效的测试流程

一、引言 在当前的软件开发环境中,API(Application Programming Interface)扮演了极为重要的角色,连接着应用的各个部分。对API进行自动化测试能够提高测试效率,降低错误,确保软件产品的质量。本文将通过实…

LeetCode 每日一题 Day 5【Hard】

2646. 最小化旅行的价格总和 现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ai, bi] 表示树中节点 ai 和 b~i ~之间存在一条边。 每个节点都关…

OpenResty入门与实践:下载安装、环境变量、常用命令及案例解析

文章目录 一、Openresty下载安装二、设置环境变量三、常用命令四、入门案例五、实践案例1、lua-nginx-module1)入门案例2)获取Nginx uri中的单一变量3)获取Nginx uri中的所有变量 2、Nginx缓存1)Nginx全局共享内存缓存2&#xff0…

使用 MITRE ATTCK® 框架缓解网络安全威胁

什么是MITRE ATT&CK框架 MITRE Adversarial Tactics, Techniques, and Common Knowledge(ATT&CK)是一个威胁建模框架,用于对攻击者用来入侵企业、云和工业控制系统(ICS)并发起网络攻击…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展,简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习(parallel federated learning,PFL),通过调换中心节点聚合和广播的顺序。本文…

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日,MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的,旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony(简称“OpenHarmony”&a…