Python推导式大全与实战:精通列表、字典、集合和生成器推导式【第115篇—python:推导式】

news2024/9/30 7:19:16

Python推导式大全与实战:精通列表、字典、集合和生成器推导式

Python语言以其简洁、优雅的语法而闻名,其中推导式是其独特之处之一。推导式是一种在一行代码中构建数据结构的强大方式,它涵盖了列表、字典、集合和生成器。本篇博客将全面介绍Python中的推导式,并通过实战演示展示其强大功能。

IMG_20231006_183505

1. 列表推导式

列表推导式是Python中最常见的推导式之一,用于快速创建列表。其语法结构如下:

new_list = [expression for item in iterable if condition]

实例: 通过列表推导式生成1到10的平方数列表。

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

代码解析: 在这个例子中,我们使用range(1, 11)生成1到10的数字序列,并通过列表推导式计算每个数字的平方,最终得到squares列表。

2. 字典推导式

字典推导式用于创建字典,其语法结构为:

new_dict = {key_expression: value_expression for item in iterable if condition}

实例: 通过字典推导式生成数字与其平方的映射。

squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict)

代码解析: 在这个例子中,我们使用range(1, 6)生成1到5的数字序列,并通过字典推导式创建了一个字典,其中键为数字,值为对应数字的平方。

3. 集合推导式

集合推导式类似于列表推导式,但用于创建集合。其语法结构为:

new_set = {expression for item in iterable if condition}

实例: 通过集合推导式生成1到10的奇数集合。

odd_numbers = {x for x in range(1, 11) if x % 2 != 0}
print(odd_numbers)

代码解析: 在这个例子中,我们使用range(1, 11)生成1到10的数字序列,并通过集合推导式筛选出奇数,最终得到odd_numbers集合。

4. 生成器推导式

生成器推导式是一种懒加载的推导式,用于生成一个生成器对象。其语法结构为:

new_generator = (expression for item in iterable if condition)

实例: 通过生成器推导式生成1到10的平方数生成器。

squares_generator = (x**2 for x in range(1, 11))
for square in squares_generator:
    print(square)

代码解析: 在这个例子中,我们使用生成器推导式创建了一个生成器对象,并通过循环打印每个平方数。生成器是一种高效利用内存的方式,逐个生成元素而不一次性存储所有元素。

通过这些推导式,你可以在Python中更加高效地处理数据结构,减少代码量,提高可读性。深入理解这些推导式的用法将为你的Python编程之旅增添更多的技巧和便利。

5. 嵌套推导式

Python推导式还支持嵌套,可以在一个推导式中使用多个循环和条件语句,构建更为复杂的数据结构。

实例: 通过嵌套列表推导式创建一个九九乘法表。

multiplication_table = [[i * j for j in range(1, 10)] for i in range(1, 10)]
for row in multiplication_table:
    print(row)

代码解析: 在这个例子中,我们使用嵌套的列表推导式创建了一个包含九九乘法表的二维列表。外层循环遍历1到9的数字,内层循环遍历1到9的数字,并通过表达式i * j计算乘积。

6. 条件表达式

推导式中的条件表达式允许根据条件选择不同的表达式。

实例: 通过条件表达式在列表推导式中筛选奇数和偶数。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even_odd_classification = ["Even" if x % 2 == 0 else "Odd" for x in numbers]
print(even_odd_classification)

代码解析: 在这个例子中,我们使用条件表达式判断数字是奇数还是偶数,然后通过列表推导式生成一个包含奇偶分类的列表。

7. 推导式的性能考虑

虽然推导式提供了紧凑的语法,但在处理大规模数据时,需要注意性能问题。生成器推导式通常更适合处理大型数据集,因为它们采用惰性加载的方式,逐个生成元素而不在内存中存储所有元素。

实例: 使用生成器推导式生成斐波那契数列。

fibonacci_generator = (fibonacci(n) for n in range(10))

def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

for number in fibonacci_generator:
    print(number)

代码解析: 在这个例子中,我们使用生成器推导式生成斐波那契数列的前10个元素。由于斐波那契数列的计算涉及递归,使用生成器推导式可以有效避免内存溢出问题。

通过以上介绍的不同类型的推导式和实际示例,相信你已经对Python中的推导式有了更深入的理解。这些强大的工具使得在Python中处理数据结构变得更加轻松和高效。在实际项目中,合理运用推导式能够提高代码的可读性和性能。

8. 使用推导式进行数据过滤和转换

推导式不仅可以用于创建数据结构,还可以用于数据的过滤和转换,使得数据处理更为灵活。

实例: 通过列表推导式过滤出长度大于等于3的单词。

words = ["apple", "banana", "pear", "kiwi", "orange"]
filtered_words = [word for word in words if len(word) >= 3]
print(filtered_words)

代码解析: 在这个例子中,我们使用列表推导式遍历单词列表,并通过条件表达式len(word) >= 3筛选出长度大于等于3的单词,最终得到filtered_words列表。

9. 推导式与函数结合

推导式可以与函数结合,进一步提高代码的简洁性和可读性。

实例: 使用列表推导式和函数计算列表中每个元素的平方根。

import math

numbers = [4, 9, 16, 25, 36]
square_roots = [math.sqrt(num) for num in numbers]
print(square_roots)

代码解析: 在这个例子中,我们使用math.sqrt()函数计算每个数字的平方根,并通过列表推导式生成包含平方根的列表。

10. 推导式的灵活运用

推导式可以根据实际需求进行灵活运用,组合使用不同类型的推导式。

实例: 使用列表推导式和集合推导式创建一个包含数字平方和的集合。

numbers = [1, 2, 3, 4, 5]
squares_set = {x**2 for x in numbers}
print(squares_set)

代码解析: 在这个例子中,我们首先使用列表推导式生成数字的平方列表,然后通过集合推导式将其转化为集合,去除重复的元素,最终得到squares_set集合。

通过这些实例,你可以更全面地理解和运用Python推导式,使得代码更为简洁、可读且高效。推导式是Python语言中的一项强大特性,善用它将使你的代码更加优雅和易于维护。

11. 推导式在文件处理中的应用

推导式在文件处理中也能发挥巨大作用,例如读取文件内容并进行处理。

实例: 通过文件读取和列表推导式获取文件中所有行的长度。

file_path = 'sample.txt'

# 读取文件并获取每行的长度
line_lengths = [len(line) for line in open(file_path)]

print(line_lengths)

代码解析: 在这个例子中,我们使用列表推导式一行代码完成了文件读取和每行长度的获取。open(file_path)打开文件,len(line)计算每行的长度,并将结果存储在line_lengths列表中。

12. 推导式处理多层嵌套数据结构

推导式在处理多层嵌套的数据结构时表现得尤为出色。

实例: 使用嵌套列表推导式将二维列表扁平化。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 扁平化嵌套列表
flattened_list = [num for row in matrix for num in row]

print(flattened_list)

代码解析: 在这个例子中,通过嵌套列表推导式,我们将二维列表matrix扁平化为一个一维列表flattened_list。外层循环遍历行,内层循环遍历行中的元素,从而快速构建扁平化的列表。

13. 推导式的错误处理

推导式中也可以使用异常处理机制,使得代码更加健壮。

实例: 使用列表推导式过滤掉非整数元素。

mixed_data = [1, 2, 'three', 4, 'five', 6]

# 过滤非整数元素
filtered_integers = [num for num in mixed_data if isinstance(num, int)]

print(filtered_integers)

代码解析: 在这个例子中,我们使用isinstance()函数检查元素是否为整数,通过列表推导式过滤出整数元素,避免了非整数元素引起的错误。

通过这些例子,你可以看到推导式在不同场景中的广泛应用,从文件处理到多层嵌套数据结构的处理,甚至是错误处理方面都能展现其强大的表达能力。合理运用推导式,可以让你的代码更加简洁、高效,并提高代码的可读性。### 14. 推导式在字典操作中的妙用

推导式同样在字典操作中展现出其灵活性和便捷性。

实例: 使用字典推导式从两个列表创建字典。

keys = ['name', 'age', 'city']
values = ['Alice', 25, 'New York']

# 创建字典
data_dict = {key: value for key, value in zip(keys, values)}

print(data_dict)

代码解析: 在这个例子中,我们使用zip()函数将两个列表打包成元组,然后通过字典推导式创建字典。这种方式非常适合从不同来源的数据构建字典。

15. 推导式的可读性和维护性

虽然推导式可以让代码更为紧凑,但在一些复杂的场景下,过度使用可能导致代码难以理解。因此,在实际应用中,要根据情况权衡代码的可读性和紧凑性。

实例: 使用列表推导式生成斐波那契数列的偶数项,并通过注释提高可读性。

fibonacci_numbers = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

# 通过列表推导式筛选斐波那契数列的偶数项
even_fibonacci = [num for num in fibonacci_numbers if num % 2 == 0]

print(even_fibonacci)

代码解析: 在这个例子中,我们使用列表推导式生成斐波那契数列的偶数项,同时通过注释提供了对代码的解释,提高了可读性。

16. 推导式在数据分析中的应用

推导式在数据分析中常被用于快速处理和转换数据。

实例: 使用集合推导式去除列表中的重复元素。

data = [1, 2, 3, 2, 4, 5, 3, 6, 7]

# 去除重复元素
unique_data = list({x for x in data})

print(unique_data)

代码解析: 在这个例子中,我们使用集合推导式创建了一个集合,自动去除了列表中的重复元素,然后通过list()将集合转换为列表。

通过这些例子,你可以看到推导式在字典操作、可读性和维护性、以及数据分析中的广泛应用。掌握这些用法,可以使得你在实际编码中更加得心应手,提高代码效率和可维护性。

17. 推导式在异步编程中的运用

在异步编程中,推导式同样能够简化代码,提高效率。

实例: 使用列表推导式和异步函数创建异步任务列表。

import asyncio

async def async_task(item):
    # 异步任务,这里简单地将数字平方
    return item**2

# 创建异步任务列表
async_tasks = [async_task(num) for num in range(5)]

# 执行异步任务
results = asyncio.run(asyncio.gather(*async_tasks))

print(results)

代码解析: 在这个例子中,我们使用列表推导式创建了一个包含异步任务的列表async_tasks,然后通过asyncio.gather()执行这些异步任务,最终得到异步任务的结果列表。

18. 推导式的高级用法

推导式还支持一些高级的用法,如条件表达式的嵌套、多个for子句的组合等。

实例: 使用条件表达式的嵌套在列表推导式中实现FizzBuzz问题。

result = ["Fizz" if i % 3 == 0 else "Buzz" if i % 5 == 0 else i for i in range(1, 16)]
print(result)

代码解析: 在这个例子中,我们使用了条件表达式的嵌套,根据FizzBuzz问题的规则生成了一个包含结果的列表。

19. 推导式的可读性与Lambda函数结合

Lambda函数可以与推导式结合,进一步简化代码。

实例: 使用Lambda函数和列表推导式计算列表中每个元素的平方。

numbers = [1, 2, 3, 4, 5]
squares = [(lambda x: x**2)(num) for num in numbers]
print(squares)

代码解析: 在这个例子中,我们使用了Lambda函数,通过列表推导式计算了每个元素的平方,Lambda函数在这里用于定义简单的平方计算函数。

20. 推导式的限制与适用场景

虽然推导式具有强大的功能,但在某些情况下可能并不是最佳选择。当推导式变得复杂难以理解时,可以考虑使用传统的循环结构。

实例: 使用传统循环结构计算列表中每个元素的阶乘。

numbers = [1, 2, 3, 4, 5]
factorials = []
for num in numbers:
    result = 1
    for i in range(1, num + 1):
        result *= i
    factorials.append(result)

print(factorials)

代码解析: 在这个例子中,我们使用传统的嵌套循环结构计算了列表中每个元素的阶乘。虽然推导式也能实现,但使用循环结构可能更易理解。

通过这些例子,你可以更深入地理解推导式的高级用法,以及在一些特殊场景下的限制。优雅地使用推导式和其他Python语言特性,能够提高代码的可读性和编程效率。

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

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

相关文章

二维码门楼牌管理系统技术服务:文字规范与技术创新

文章目录 前言一、文字规范&#xff1a;确保信息传达的准确性二、技术创新&#xff1a;推动二维码门楼牌管理系统的升级发展 前言 在数字化时代的浪潮下&#xff0c;二维码门楼牌管理系统作为一种创新的城市管理手段&#xff0c;逐渐进入大众视野。这套系统不仅优化了城市空间…

131. 分割回文串(力扣LeetCode)

文章目录 131. 分割回文串题目描述回溯代码 131. 分割回文串 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xf…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

Linux下进程相关概念详解

目录 一、操作系统 概念 设计操作系统的目的 定位 如何理解“管理” 系统调用和库函数概念 二、进程 概念 描述进程—PCB&#xff08;process control block&#xff09; 查看进程 进程状态 进程优先级 三、其它的进程概念 一、操作系统 概念 任何计算机系统都包…

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

如何使用Docker搭建StackEdit编辑器并结合内网穿透实现远程办公

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

oms-Diffusion:用户可上传服装图片与参考姿势图进行试穿,解决服装行业高昂成本问题

之前已经向大家介绍了很多关于虚拟试穿的项目&#xff0c;如谷歌的Tryon Diffusion, 阿里的Outfit Anyone, 亚马的Diffuse to Choose。东京大学的OOTDiffusion虚拟服装试穿工具。基于扩散模型的技术基本已经成为现在主流应用的基石。感兴趣的小伙伴可以点点击下面链接阅读~ 电商…

GEE入门篇|图像处理(一):理论介绍

光谱指数是基于地球表面不同的物体和土地覆盖反射不同波长的不同数量的太阳光的事实。例如&#xff0c;在光谱的可见部分&#xff0c;健康的绿色植物反射大量的绿光&#xff0c;同时吸收蓝光和红光——这就是为什么它在我们的眼中是绿色的。来自太阳的光的波长也超出了人眼所能…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来&#xff0c;它的语义化其实是为了便于机器来看的&#xff0c;当然&#xff0c;程序员在使用语义化标签时也可以使得代码更加易读&#xff0c;对于用户来说&#xff0c;这样有利于构建良好的网页结构&#xff0c;可以在优化用户体…

Vue开发实例(四)Element-UI部分组件使用方法

Element-UI的使用 一、Icon图标的使用1、用 i 标签使用图标 二、用 el-button 使用图标1、使用type定义样式2、使用plain定义样式3、使用round定义样式4、使用circle定义样式5、带图标和文字的按钮6、按钮禁用7、文字按钮8、按钮组9、加载中 三、Link 文字链接1、基础用法2、禁…

LaTeX-设置表格大小

文章目录 LaTeX-设置表格大小1.创建表格2.设置表格的宽度2.1控制表格每一列的宽度2.2控制整个表格的宽度 3.设置表格的外观4.LaTeX绘制三线表 LaTeX-设置表格大小 本文介绍了LaTeX如何设置表格的大小、改变表格的外观以及如何绘制三线表。 1.创建表格 在LaTeX中创建表很耗时…

Springboot+vue的高校教师教研信息填报系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校教师教研信息填报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

Hololens 2应用开发系列(1)——使用MRTK在Unity中设置混合现实场景并进行程序模拟

Hololens 2应用开发系列&#xff08;1&#xff09;——使用MRTK在Unity中进行程序模拟 一、前言二、创建和设置MR场景三、MRTK输入模拟的开启 一、前言 在前面的文章中&#xff0c;我介绍了Hololens 2开发环境搭建和项目生成部署等相关内容&#xff0c;使我们能生成一个简单Ho…

100个百万阅读公众号爆文案例

100个100万公众号爆文案例 自从公众号流量推送修改之后&#xff0c;原来的私域玩法一去不复返&#xff0c;公域公众号正在崛起 现在公众号的玩法就是找爆款&#xff0c;去对标&#xff0c;去学习&#xff0c;努力使自己的公众号进入流量池&#xff0c;然后吃流量主的收益 这里…

【数据结构和算法】根据前序、中序、后序来确定一颗二叉树

目录 0 引言1 确定二叉树结构的方式1.1 前序和中序1.2 后序和中序1.3 前序和后序&#xff1a;无法确定结构 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计网概述、计网…

Redis-基础篇

Redis是一个开源、高性能、内存键值存储数据库&#xff0c;由 Salvatore Sanfilippo&#xff08;网名antirez&#xff09;创建&#xff0c;并在BSD许可下发布。它不仅可以用作缓存系统来加速数据访问&#xff0c;还可以作为持久化的主数据存储系统或消息中间件使用。Redis因其数…

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章&#xff0c;我们简述了当前主流的存储器技术&#xff0c;现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

vue2结合electron开发桌面端应用

一、Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 。允许您保持一个 JavaScript 代码代码库并创建可在Windows、macOS和Linux上运行的跨平台应用 。 Electron 经常与 Ch…

文献阅读笔记《Spatial-temporal Forecasting for Regions without Observations》13页

目录 目录 目录 发行刊物 ABSTRACT 1 INTRODUCTION 2 RELATED WORK&#xff08;相关工作 2.1 Spatial-temporal Forecasting&#xff08;时空预测 2.2 Spatial-temporal Forecasting withIncomplete Data&#xff08;不完全数据的时空预测 2.3 Graph Contrastive Lear…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…