Python基础:推导式(Comprehensions)详解

news2024/11/19 15:20:42

在这里插入图片描述

1. 推导式概念

  Python推导式(comprehensions)是一种简洁而强大的语法,用于从已存在的数据(列表、元组、集合、字典等)中创建新的数据结构。推导式包括:

  • 列表推导式
  • 元组推导式
  • 字典推导式
  • 集合推导式

2. 列表推导式

  列表推导式创建列表的方式更简洁。常见的用法为,对序列或可迭代对象中的每个元素应用某种操作,用生成的结果创建新的列表;或用满足特定条件的元素创建子序列。
  例如:创建平方值的列表

squares = []
for x in range(10):
    squares.append(x**2)
print(squares)

在这里插入图片描述
  这段代码创建(或覆盖)变量 x,该变量在循环结束后仍然存在。
  下述方法可以无副作用地计算平方列表:

# 1)第一种方式
squares = list(map(lambda x : x**2 in range(10)))

# 2) 第二种方式
squares = [x**2 for x in range(10)]

2.1 语法格式

  列表推导式(List comprehension)是一种在一行代码中创建和操作列表的简洁方式。
  它的基本语法形式如下:

[expression for item in iterable if condition]
  1. expression是对 item的操作或表达式,可以是有返回值的函数。
    2.item是迭代变量,表示可迭代对象中的每个元素。
  2. iterable是可迭代对象,如列表、元组、字符串等。
  3. condition是一个可选的条件,用于过滤元素。

  注意:列表推导式的方括号内包含以下内容:一个表达式,后面为一个 for 子句,然后,是零个或多个forif 子句。结果是由表达式依据 for if 子句求值计算而得出一个新列表。

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
"""
    上述推导式等同于:
        combs = []
        for x in [1,2,3]:
            for y in [3,1,4]:
                if x != y:
                    combs.append((x, y))
        combs
"""
# 输出 [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

2.2 示例及应用

"""
筛选和转换数据: 
列表推导式允许你根据特定的条件从一个列表中选择或转换元素,从而创建一个新的列表。例如,你可以过滤出所有的偶数或将列表中的字符串转换为大写。
"""
# 筛选偶数
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)

# 过滤出字符串列表中长度大于3的单词
words = ['python', 'is', 'awesome', 'and', 'fun']
long_words = [word for word in words if len(word)>=3]
print(long_words)

# 转换字符串为大写
words = ['hello', 'world', 'python']
upper_words = [word.upper() for word in words]
print(upper_words)

  运行效果:

在这里插入图片描述

"""
生成序列: 
通过列表推导式,你可以用一行代码生成各种序列,如数字序列、字符序列等。
"""
# 生成平方序列
squares = [x**2 for x in range(5)]
print(squares)

# 生成字符序列
chars = [char for char in 'python']
print(chars)

  运行效果:

在这里插入图片描述

"""
嵌套迭代: 
列表推导式支持嵌套,可以用来创建嵌套结构的数据,例如二维列表。
"""
# 创建二维列表
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
print(matrix)

# 生成一个包含 3 行 4 列的二维列表,每个元素都是其行索引和列索引的和
matrix_o = [[row + col for col in range(4)] for row in range(3)]
print(matrix_o)

  运行效果:

在这里插入图片描述

"""
    使用复杂的表达式和嵌套函数
"""
from math import pi
[str(round(pi,i)) for i in range(1,6)] 

  运行效果:

在这里插入图片描述

3. 元组推导式

  在Python中,元组推导式(Tuple Comprehension)是一种用于创建元组的紧凑语法。它的语法结构与列表推导式类似,但使用圆括号()而不是方括号[]

3.1 语法格式

tuple_variable = (expression for item in iterable if condition)

1.expression 是生成元组元素的表达式。
2.item 是可迭代对象中的每个元素。
3.iterable是一个可迭代对象,例如列表、字符串等。
4. condition是一个可选的条件,用于过滤元素。

3.2 示例及应用

"""
创建元组序列:
当需要生成一个元组序列时,元组推导式是一种简洁的方式。例如,可以使用元组推导式创建包含某种规律的数字、字符串或其他元素的元组序列。
"""
# 生成包含平方数的元组序列
squares_tuple = tuple(x**2 for x in range(5))
print(squares_tuple)

  运行效果:

在这里插入图片描述

"""
转换数据:
当有一个可迭代的对象,并希望将其转换为元组时,可以使用元组推导式。这在处理数据时很常见。
"""
# 将字符串长度转换为元组
words = ['apple', 'banana', 'orange']
lengths_tuple = tuple(len(word) for word in words)
print(lengths_tuple)

  运行效果:

在这里插入图片描述

"""
过滤数据:通过添加条件语句,可以使用元组推导式从可迭代对象中选择特定的元素。
"""
# 生成包含偶数平方数的元组序列
even_squares_tuple = tuple(x**2 for x in range(5) if x % 2 == 0)
print(even_squares_tuple)

  运行效果:

在这里插入图片描述

"""
函数返回多个值:
在某些情况下,可能希望从函数中返回多个值作为元组,而元组推导式可以用于在函数中快速生成这样的元组。
"""
def get_coordinates():
    x_values = [1, 2, 3]
    y_values = [4, 5, 6]
    return tuple((x, y) for x, y in zip(x_values, y_values))

coordinates = get_coordinates()
print(coordinates)

  运行效果:

在这里插入图片描述

3.3 与生成器表达式区别

  元组推导式(Tuple Comprehension)和生成器表达式(Generator Expression)在语法上很相似,但有一些关键的区别。以下是它们之间的主要区别:

3.3.1 返回类型

  • 元组推导式返回一个元组(tuple)。
  • 生成器表达式返回一个生成器对象(generator)。

3.3.2 语法

  • 元组推导式使用圆括号 ()。
  • 生成器表达式使用圆括号 (),但是在语法上可以省略,这与列表推导式不同。
# 元组推导式
tuple_comp = tuple(x**2 for x in range(5))

# 生成器表达式
generator_expr = (x**2 for x in range(5))

3.3.3 内存占用

  • 元组推导式会生成一个完整的元组对象,占用相应的内存。
  • 生成器表达式生成一个生成器对象,它是一个惰性计算的序列,只在需要时生成元素,因此在内存上更为高效。

3.3.4 迭代方式

  • 元组推导式一次性生成所有元素,可以直接进行索引、切片等操作。
  • 生成器表达式是惰性的,只在每次迭代时生成一个元素,因此不能直接进行索引和切片等操作。

  总体而言,如果需要一个一次性的、完整的序列,可以使用元组推导式;而如果想要一个惰性计算的序列,以节省内存,可以使用生成器表达式。选择取决于具体需求。

4. 字典推导式

  字典推导式(Dictionary Comprehension)是一种在一行代码中创建字典的方法,类似于列表推导式。它允许你以简洁的方式从一个可迭代对象中创建一个字典.

4.1 语法格式

  可以有0个或多个条件表达式,根据具体的需求决定是否使用条件。

{key_expression: value_expression for item in iterable if condition}

1.key_expression 是用于生成字典键的表达式。
2. value_expression 是用于生成字典值的表达式。
3.item 是可迭代对象中的每个元素。
4. if condition是一个可选的条件表达式,用于过滤元素。

4.2 示例及应用

  字典推导式在许多场景下都是一种方便且简洁的方式来创建和操作字典。以下是一些常见的字典推导式的应用场景:

"""
转换数据格式:
当有一个可迭代对象,想要将其转换为字典形式时,字典推导式是一种便捷的方式。
例如,将元组列表转换为字典:
"""
tuple_list = [('a', 1), ('b', 2), ('c', 3)]
my_dict = {key: value for key, value in tuple_list}
print(tuple_list)

  运行效果:

在这里插入图片描述

"""
过滤数据:
通过在字典推导式中添加条件表达式,可以过滤可迭代对象的元素,从而创建一个满足特定条件的字典。
例如,只选择某个范围内的元素
"""
original_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
filtered_dict = {key: value for key, value in original_dict.items() if value > 2}
print(filtered_dict)

  运行效果:

在这里插入图片描述

"""
键或值的转换:
可以使用字典推导式来对字典的键或值进行某种转换。
例如,将字典的键和值交换:
"""
original_dict = {'a': 1, 'b': 2, 'c': 3}
swapped_dict = {value: key for key, value in original_dict.items()}
print(swapped_dict)

  运行效果:

在这里插入图片描述

"""
处理嵌套结构:
当有一个嵌套的可迭代对象,想要将其展平为字典时,字典推导式也很有用。
例如,展平嵌套的字典:
"""
nested_dict = {'a': {'x': 1, 'y': 2}, 'b': {'x': 3, 'y': 4}}
flattened_dict = {outer_key: inner_value for outer_key, inner_dict in nested_dict.items() for inner_key, inner_value in inner_dict.items()}
print(flattened_dict)

  运行效果:

在这里插入图片描述

"""
默认值处理:
在字典推导式中,可以使用字典的 get 方法或 default 关键字处理不存在的键,从而设置默认值。这在构建字典时非常有用。
"""
original_dict = {'a': 1, 'b': 2, 'c': 3}
keys = ['a', 'b', 'c']
default_value = 0
my_dict = {key: original_dict.get(key, default_value) for key in keys}
print(my_dict)

  运行效果:

在这里插入图片描述

5. 集合推导式

  在Python中,可以使用集合推导式来创建集合。集合推导式的语法与列表推导式类似,但是使用大括号{} 表示集合。

5.1 语法格式

{expression for item in iterable if condition}
  1. expression是一个表达式,用于计算集合中的元素。
    2.item 是可迭代对象(如列表、元组等)中的每个元素。
    3.iterable 是一个可迭代对象,例如 range(1, 11)。
  2. condition是一个可选的条件,用于筛选满足条件的元素。

5.2 示例及应用

  集合推导式在Python中是一个强大而灵活的工具,适用于多种应用场景。以下是一些常见的集合推导式的应用场景:

"""
过滤数据:
可以使用集合推导式从一组数据中筛选出满足特定条件的元素。
例如,从一个列表中选择所有大于某个阈值的数字。
"""
numbers = [1, 5, 8, 10, 15, 20]
filtered_numbers = {x for x in numbers if x > 10}
print(filtered_numbers)

  运行效果:

在这里插入图片描述

"""
映射转换:
使用集合推导式可以对数据进行转换,生成一个新的集合。例
如,将字符串列表转换为它们的长度集合。
"""
words = ["apple", "banana", "orange"]
word_lengths = {len(word) for word in words}
print(word_lengths)

  运行效果:

在这里插入图片描述

"""
去重:
创建一个不包含重复元素的集合。这对于从列表或其他可迭代对象中移除重复项非常有用。
"""
numbers_with_duplicates = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = {x for x in numbers_with_duplicates}
print(unique_numbers)

  运行效果:

在这里插入图片描述

"""
集合运算:
使用集合推导式进行集合运算,如并集、交集等。
例如,找到两个集合的交集。
"""
set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}
intersection = {x for x in set1 if x in set2}
print(intersection)

  运行效果:

在这里插入图片描述

"""
条件化处理:
在集合推导式中,可以根据特定条件对元素进行处理。
例如,将列表中的奇数平方加倍。
"""
numbers = [1, 2, 3, 4, 5]
doubled_odd_squares = {x**2 * 2 for x in numbers if x % 2 != 0}
print(doubled_odd_squares)

  运行效果:

在这里插入图片描述

6. 使用推导式的优点

  • 简洁性
      推导式允许以一种紧凑的方式表示数据转换和过滤,减少了冗余的代码行数。这使得代码更加简洁、清晰,同时减少了错误的可能性。

  • 可读性
      推导式提高了代码的可读性,尤其是对于简单的转换和过滤操作。它们可以帮助将复杂的操作用一行或几行代码清晰地表达出来,使得代码更易于理解。

  • 效率
      推导式通常比传统的迭代方式更高效。它们背后的实现在一些情况下可以提供更好的性能,因为它们是由底层的高效数据结构实现的。

  • 功能性
      推导式支持丰富的功能,包括条件过滤、多个迭代器的组合、元素的映射转换等。这使得推导式成为一种灵活而强大的工具,适用于各种不同的场景。

  • 一致性
      推导式提供了一种统一的语法结构,使得在不同的数据类型(列表、集合、字典等)上进行转换和过滤变得一致。这种一致性使得代码更易于维护和修改。

  • 减少临时变量
      使用推导式可以减少在代码中引入不必要的临时变量。这有助于保持代码的简洁性和可读性。

  • 支持多种数据结构
      不仅可以在列表中使用推导式,还可以在集合、字典等数据结构上使用,扩展了推导式的适用范围。

7. 参考

参考列表
  官网:https://docs.python.org/zh-cn/3/tutorial/datastructures.html#list-comprehensions
  菜鸟教程:https://www.runoob.com/python3/python-comprehensions.html

在这里插入图片描述

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

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

相关文章

鸿蒙原生应用/元服务开发-AGC分发如何生成密钥和和证书请求文件

HarmonyOS通过数字证书(.cer文件)和Profile文件(.p7b文件)等签名信息来保证应用的完整性,应用如需上架到华为应用市场必须通过签名校验。因此,开发者需要使用发布证书和Profile文件对应用进行签名后才能发布…

Gee教程3.实现前缀树路由

需要完成的目标 使用 Trie 树实现动态路由(dynamic route)解析。支持两种模式:name和*filepath,(开头带有:或者*) 这里前缀树的实现修复了Go语言动手写Web框架 - Gee第三天 前缀树路由Router | 极客兔兔​​​​​​ 中路由冲突的bug。 Trie树简介 之前&#xff0…

20世纪的葡萄酒有哪些创新?

葡萄酒是用酵母发酵的,直到20世纪中叶,这一过程都依赖于自然产生的酵母。这些发酵的结果往往不一致,而且由于发酵时间长,容易腐败。 酿酒业最重要的进步之一是在20世纪50、60年代引进了地中海的纯发酵菌种酿酒酵母,俗称…

全面介绍SSO(单点登录)

全面介绍SSO(单点登录) SSO英文全称Single SignOn,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比…

C++类与对象(7)—友元、内部类、匿名对象、拷贝对象时编译器优化

目录 一、友元 1、定义 2、友元函数 3、友元类 二、内部类 1、定义 2、特性: 三、匿名对象 四、拷贝对象时的一些编译器优化 1、传值&传引用返回优化对比 2、匿名对象作为函数返回对象 3、接收返回值方式对比 总结: 一、友元 1、定义…

0005Java程序设计-ssm基于微信小程序的校园求职系统

文章目录 摘 要目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:776871563 摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据…

因为计算机中丢失MSVCP140.dll,无法启动此程序运行软件的解决方法

msvcp140.dll重新安装五个解决方法与msvcp140.dll文件的作用和丢失对电脑的影响介绍 正文: 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“缺少xxx.dll文件”。而msvcp140.dll就是其中之一。那么,msvcp140.…

哈希表——闭散列表

该哈希表实现是闭散列实现法。 闭散列表: 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。 那如何寻…

sprintboot快速初始化【Springboot】

1.首先选择创建项目 2.填写对应的项目信息 一定要勾选maven,否则没有pom文件,选择next 3.选择应用场景 点击 create,DIEA就会根据你的选择自动创建项目骨架; 4.创建一个控制层 随便创建一个控制层,测试一下项目是否…

阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?

10月23 日14:00左右,蚂蚁集团旗下的在线文档编辑与协同工具语雀发生服务器故障,在线文档和官网都无法打开。直到当天晚上22:24,语雀服务才全部恢复正常。从故障发生到完全恢复正常,语雀整个宕机时间将近 8 小时,如此长…

麒麟V10桌面搭建FTP服务

1.1介绍 FTP:File transfer protocol (文件传输协议)是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FT…

Java变量理解

成员变量VS局部变量的区别 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰…

深度盘点:100 个 Python 数据分析函数总结

经过一段时间的整理,本期将分享我认为比较常用的100个实用函数,这些函数大致可以分为六类,分别是统计汇总函数、数据清洗函数、数据筛选、绘图与元素级运算函数、时间序列函数和其他函数。 技术交流 技术要学会交流、分享,不建议…

DMX512协议及对接口电路的分析

1、DMX512协议简介 DMX 是Digital MultipleX 的缩写,意为多路数字传输(具有512条信息的数字多路复用”)。DMX512控制协议是美国舞台灯光协会(usITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准,全称是USITTDMX512(1990); DMX512 在其物理…

达索系统3DEXPERIENCE WORKS 2024 结构仿真功能增强

simulia结构仿真是什么? 不仅能对结构进行力学、热学、声学等多学科计算,辅助于设计方案的优化;还能采用数字化技术模拟产品性能,大幅节约试验和样机迭代成本。达索系统3DEXPERIENCE WORKS 2024 结构仿真为企业提供随需应变、精准…

Android开源框架--Dagger2详解

功名只向马上取,真是英雄一丈夫 一,定义 我们知道在一个类中,通常会定义其他类型的变量,这个变量就是我们所说的“依赖“。 对一个类的变量进行初始化,有两种方式。第一种,这个类自己进行初始化&#xff…

Linux环境安装Java,Tomcat,Mysql,

1、Java的安装 载 jdk1.8 注:此处 CentOS7 是64位,所以下载的是:Linux x64, 文件类型为 tar.gz 的文件 JDK 官网地址:https://www.oracle.com/java/ cd /usr/local/ mkdir jdk cd jdk/tar -xvf jdk-8u202-linux-x64.…

pandas教程:US Baby Names 1880–2010 1880年至2010年美国婴儿姓名

文章目录 14.3 US Baby Names 1880–2010(1880年至2010年美国婴儿姓名)1 Analyzing Naming Trends(分析命名趋势)评价命名多样性的增长“最后一个字母”的变革变成女孩名字的男孩名字(以及相反的情况) 14.3…

【Docker项目实战】使用Docker部署Plik临时文件上传系统

【Docker实战项目】使用Docker部署Plik 临时文件上传系统 一、Plik介绍1.1 Plik简介1.2 Plik特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Plik镜像五、部署Plik临时…