Python推导式详细讲解

news2025/1/22 9:08:57

更多资料获取

📚 个人网站: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.coloradmin.cn/o/1290160.html

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

相关文章

pytorch中的transpose用法

注意:维数从0开始,0维 1维2维…,负数代表从右往左数,-1代表第一维,以此类推 import torch import numpy as np# 创建一个二维数组 arr torch.tensor([[[1, 2],[3, 4]],[[5, 6],[7, 8]]]) print("原始数组:"…

resnet 图像分类的项目

1. 项目文件 文件下载资源:resnet 图像分类的项目代码 本章利用reset34 作图像分类,包括计算训练集和测试集的loss、accuracy曲线,对训练好的网络在训练集测试集上求混淆矩阵 data 文件为训练集测试集,图像按照文件夹摆放inferenc…

电源滤波器如何检测?ATECLOUD-POWER电源自动测试软件如何助力?

电源滤波器常用来对电源中的纹波和干扰信号进行滤波,从而确保元器件不受损坏,是保证系统稳定性的重要方法。因此电源滤波器测试是非常重要的,通过检测来评估其质量、性能和稳定性,从而使电源滤波器可以稳定工作,进行滤…

HarmonyOS 修改App的默认加载的界面(ArkTS版本)(十七)

根据鸿蒙系统APP的应用生命周期结构(鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期)来看。 1、首先在roject/entry/src/main/ets/entryability/EntryAbility.ts文件中找到UI加载函数:onWindowStageCreate(…){…},然后找到windo…

Jupyter Notebook工具

Jupyter Notebook 是一个交互式的笔记本环境,允许用户以网页形式编写和分享代码、文本、图像以及其它多媒体内容。它支持超过 40 种编程语言,最常用的是 Python。 以下是 Jupyter Notebook 工具的一些特点和用法: 1. 特点: 交互式…

Ubuntu安装过程记录

软件准备 硬件 Acer电脑,AMD a6-440m芯片 64g优盘一个,实际就用了不到5g。 Ubuntu :官网 下载Ubuntu桌面系统 | Ubuntu 下载桌面版Ubuntu 22.04.3 LTS LTS属于稳定版 u盘系统盘制作软件 Rufus :Rufus - 轻松创建 USB 启动…

寻找峰值00

题目链接 寻找峰值 题目描述 注意点 数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可对于所有有效的 i 都有 nums[i] ! nums[i 1]可以假设 nums[-1] nums[n] -∞ 解答思路 可以根据二分查找保证在O(log n)的时间复杂度找到峰…

西工大计算机学院计算机系统基础实验一(函数编写1~10)

还是那句话,千万不要慌,千万不要着急,耐下性子慢慢来,一步一个脚印,把基础打的牢牢的,一样不比那些人差。回到实验本身,自从​​​​​​按照西工大计算机学院计算机系统基础实验一(…

Qt-Q_OBJECT宏使用与“无法解析的外部符号qt_metacall/metaObject/qt_metacast“

有时候我们编写Qt类的时候,修改代码时直接加上Q_OBJECT宏,然后直接构建,会报如下错误: 这里的几个函数的声明是由Q_OBJECT宏引入的,而其对应的实现是由moc实现的,如果我们更新了代码但是没有执行qmake&…

自媒体创作辅助工具有哪些?四款必备图文工具推荐

自媒体创作需要有哪些辅助工具,今天我们要探讨的话题是自媒体图文工具,这是我们在打造引人入胜内容时的得力助手。在这个信息过剩的时代,图文内容已经成为自媒体传播的核心。为了使我们的内容脱颖而出,我们需要一些专业的工具来提…

大话数据结构-查找-多路查找树

注:本文同步发布于稀土掘金。 7 多路查找树 多路查找树(multi-way search tree),其每个结点的孩子可以多于两个,且每一个结点处可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。 …

回溯-组合总和

LeetCode链接 本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。 例如 k 2,n 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) 2, n(和) 4的组合。 …

分享一个Python网络爬虫数据采集利器

前言 你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据收集平台——亮数据Bright Data。 作为世界领先的数据…

单周爆售150w+,“不是羽绒服买不起,而是军大衣更有性价比”

拼多多收盘市值超过阿里,成在美中概股市值第一。 截至美股收盘(11月30日),拼多多收盘市值超过阿里巴巴,成为在美中概股中的市值第一股。拼多多收涨4.03%,报147.44美元,市值1959亿美元&#xff…

数据中心的操作系统——kubernets

操作系统的功能和模块与 Kubernetes 的功能和模块做了一个对比: Kubernetes 作为数据中心的操作系统还是主要管理数据中心里面的四种硬件资源:CPU、内存、存储、网络。 对于 CPU 和内存这两种计算资源的管理,我们可以通过 Docker 技术完成。…

mybatis-plus框架报错:Invalid bound statement(not found)

查找原因&#xff1a; 如果是第三个地方的错误&#xff0c;错误原因如下&#xff1a; 解决办法&#xff1a; 1、在pom.xml添加 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-pl…

Excel 删除空白行

目录 一. 方式一: 筛选删除二. 方式二: 定位条件三. 方式三: 隐藏非空白行&#xff0c;删除空白行 一. 方式一: 筛选删除 选中空白行对应的列&#xff0c;按下Ctrl Shift L&#xff0c;给列添加过滤条件。过滤出空白行&#xff0c;然后删除即可。 二. 方式二: 定位条件 按下…

选择更好的Notes索引附件方式

大家好&#xff0c;才是真的好。 首先介绍最近产品更新消息。在上一周&#xff0c;HCL主要发布了以下几个产品更新&#xff1a;HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能&#xff0c;这一次…

Nero刻录光盘软件-极好用

目录 一、下载Nero 二、软件安装 三、刻录数据 前言 刻录之前准备一张新的光盘&#xff0c;之前一旦使用过&#xff0c;就无法刻录&#xff0c;一定要新的光盘。 一、下载Nero nero官网下载地址&#xff1a;Nero下载 csdn免费下载地址&#xff1a;https://download.csdn.…