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.mzph.cn/news/202509.shtml

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

相关文章

喜讯:麦田(苏州)医学科技有限公司立项项目获得2024年度浙江省医药卫生科技计划资助的公告

喜讯:麦田(苏州)医学科技有限公司立项项目获得2024年度浙江省医药卫生科技计划资助的公告 我们麦田(苏州)医学科技有限公司非常荣幸地宣布,由我们联合浙江省人民医院、杭州市红十字会医院、杭州师范大学共同…

Docker-多容器应用

一、概述 到目前为止,你一直在使用单个容器应用。但是,现在您将 MySQL 添加到 应用程序堆栈。经常会出现以下问题 - “MySQL将在哪里运行?将其安装在同一个 容器还是单独运行?一般来说,每个容器都应该做一件事&#x…

强化学习——简单解释

一、说明 最近 OpenAI 上关于 Q-star 的热议激起了我温习强化学习知识的兴趣。这是为强化学习 (RL) 新手提供的复习内容。 二、强化学习的定义 强化学习是人类和其他动物用来学习的学习类型。即,通过阅读房间来学习。(从反馈中学习)。让我解…

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

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

Linux环境搭建(Ubuntu22.04)+ 配置共享文件夹(Samba)

Linux开发环境准备 搭建Linux开发环境所需要的软件如下: VMware虚拟机:用于运行Linux操作系统的虚拟机软件之一,VMware下载安装在文章中不做说明,可自行百度谢谢Ubuntu光盘镜像:用于源代码编译,有闲置计算…

maven生命周期回顾

目录 文章目录 **目录**两种最常用打包方法:生命周期: 两种最常用打包方法: 1.先 clean,然后 package2.先 clean,然后install 生命周期: 根据maven生命周期,当你执行mvn install时&#xff0c…

大数据Hadoop-HDFS_架构、读写流程

大数据Hadoop-HDFS 基本系统架构 HDFS架构包含三个部分:NameNode,DataNode,Client。 NameNode:NameNode用于存储、生成文件系统的元数据。运行一个实例。 DataNode:DataNode用于存储实际的数据,将自己管理…

Python (二) 读写excel文件

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

妈妈和老婆掉进水里,孟子认为先救老婆是禽兽

妈妈和老婆同时掉进水里先救谁? 多数男人不敢回答,怕得罪老婆。孟子认为,必须先救妈妈。因为父母都照顾不好,是不孝。先救妈妈,再救老婆。 中国人的信仰是天,以及孔孟之道。中国人不信宗教。 孟子&#x…

【普中开发板】基于51单片机温度报警器设计( proteus仿真+程序+实物演示+讲解视频)

这里写目录标题 1. 主要功能:2. 讲解视频:3. 仿真4. 实物烧录和现象5. 程序代码6. 设计资料内容清单&&下载链接资料下载链接: 【普中开发板】基于51单片机温度报警器设计( proteus仿真程序实物演示讲解视频) Proteus 仿真…

求职招聘小程序源码系统 全开源源代码:找工作+招人才 平台级别运营版 附带完整的搭建教程

在当前的求职招聘市场中,尽管存在大量的求职者和招聘者,但依然存在着信息不对称、沟通不畅等问题。小编来给大家分享一款求职招聘小程序源码系统,旨在提供一个高效、便捷、安全的求职招聘平台。 以下是部分代码示例: 系统特色功能…

vue3实现2d楼宇模型

需求背景解决效果视频效果2dFloor.vue 需求背景 需要实线一个2d楼宇模型&#xff0c;并按照租户温度渲染颜色 解决效果 视频效果 2dFloor.vue <!--/*** author: liuk* date: 2023/12/06* describe: 2d楼宇模型* CSDN:https://blog.csdn.net/hr_beginner?typeblog*/--&g…

7+衰老+分型+预后模型生信思路,没思路的同学们可参考

今天给同学们分享一篇生信文章“Identification and validation of a novel senescence-related biomarker for thyroid cancer to predict the prognosis and immunotherapy”&#xff0c;这篇文章发表在Front Immunol期刊上&#xff0c;影响因子为7.3。 结果解读&#xff1a;…

用100ask 6ull配合 飞凌 elf1的教程进行学习的记录 - ap3216

100ask板子 不用改 ap3216.c "ap3216creg.h" 添加到drivers/misc 从这抄的: https://gitee.com/flameboyence/linux_driver_example/tree/master/22_i2c #include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #includ…

Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道

一、前言 对各种音视频文件格式的支持&#xff0c;是一个播放器的基础功能。一般的音视频文件只有1路流&#xff0c;比如音频文件只有1路音频流&#xff0c;视频文件只有1路音频1路视频流&#xff0c;实践过程中发现&#xff0c;还有一种ts格式的文件&#xff0c;可能有多路流…

批量免费AI写作工具,批量免费AI写作软件

人工智能&#xff08;AI&#xff09;的应用在各个领域不断创新。面对繁重的写作任务,我们应该怎么完成&#xff1f;本文将专心分享批量免费AI写作的方法、工具以及选择时需要注意的事项。 批量免费AI写作的方法 利用开源AI模型 一种常见的批量免费AI写作方法是利用开源的AI模…

2024年十大最好猫罐头有哪些?2024年10款最好的猫罐头盘点

我发现不少人有这样的困扰&#xff01;买到各种数值都很好的猫罐头后&#xff0c;猫咪一点都不吃。或者是猫咪吃了猫罐头之后&#xff0c;吃了一段时间后就软便身体不舒服。 通过本文&#xff0c;我将与大家盘点2024年10款最好的猫罐头&#xff0c;并提供一些选购猫罐头的小妙招…

第三方组件自定义扫描规则

第三方例如dubbo自定义扫描组件规则方式注入进容器。例如DubboService注解的类注入进容器中&#xff0c;实现ImportBeanDefinitionRegistrar接口&#xff0c;并通过Import注解注入。 Import除了注入ImportBeanDefinitionRegistrar类&#xff0c;还可以注入配置类Configuration和…

虚拟数字人直播软件,是如何提升直播带货效率的?

近年来&#xff0c;随着直播带货的兴起&#xff0c;虚拟数字人直播软件成为了一个备受瞩目的新兴领域。无人直播带货通过虚拟数字人主持直播和推销产品&#xff0c;为商家带来了全新的营销方式。那么&#xff0c;虚拟数字人直播软件是如何进行无人直播带货的&#xff0c;有哪些…

Linux入门指南:Linux环境变量解析

Linux环境变量解析 前言基本概念和作用常见的环境变量设置环境变量Shell脚本和环境变量环境变量的一些小规则 前言 你是不是经常听说Linux环境变量&#xff0c;但又对它一头雾水&#xff1f;别着急&#xff0c;让我们一起来揭开这个神秘的面纱&#xff0c;探索一番吧&#xff…