Python 之列表推导式

文章目录

  • 参考
  • 描述
  • 列表推导式
      • 举个栗子
      • 基本形式
      • 一般式
  • 基本形式(高阶)
      • 判断
          • 使用逻辑运算符
      • 笛卡尔积
      • 拆解
  • 变量污染
      • 列表推导式

参考

项目描述
流畅的 PythonLuciano Ramalho / 安道 吴珂
搜索引擎Bing

描述

项目描述
Python3.10.6

列表推导式

列表推导式是 Python 官方提供的一种相对更为快捷的创建列表的方式,使用列表表达式你将能够写出更加优雅(更具有可读性,也相对更为简洁)的代码。当然,你也需要为此付出一定的代价,你需要掌握它。

举个栗子

创建一个包含 0~100 内的偶数的平方的列表。对此,我们将以列表推导式或常规方式来进行实现。

常规方式

arr = []
for i in range(0, 101, 2):
    arr.append(i ** 2)

print(arr)

执行结果

[0, 4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784, 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500, 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184, 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836, 9216, 9604, 10000]

列表推导式

arr = [i ** 2 for i in range(0, 101, 2)]

print(arr)

执行结果

[0, 4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576, 676, 784, 900, 1024, 1156, 1296, 1444, 1600, 1764, 1936, 2116, 2304, 2500, 2704, 2916, 3136, 3364, 3600, 3844, 4096, 4356, 4624, 4900, 5184, 5476, 5776, 6084, 6400, 6724, 7056, 7396, 7744, 8100, 8464, 8836, 9216, 9604, 10000]

补充

常规方式与列表表达式对该目标的实现在优雅程度上相差无几,这种差距难以在较为简单的编程任务中体现。在复杂的编程任务中,使用列表推导式来进行目标的达成,于人于己都将是一种享受。

基本形式

列表表达式通过在中括号内使用 for 循环语句来指定序列中应创建元素的个数。对此,请参考如下示例:

arr = [9 * 1 for i in range(100)]

print(arr)
print(len(arr))

执行结果

[9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
100

当然,你可以使用表达式来对循环过程中发生变化的循环变量加以利用。对此,请参考如下示例:

arr = [i + i for i in range(30)]

print(arr)

执行效果

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58]

一般式

下述一般式为常见的列表推导式的运用的抽象,根据需要你可以对其进行扩展及修改。对于具体的使用方法,请参考后文。

# 基本形式
[expr for item in sequence]
# 基本形式-判断
[expr for item in sequence if condition]
# 基本形式-笛卡尔积
[expr for item1 in sequence for item2 in sequence]
# 基本形式-拆解
[expr for items in sequence for item in sequence]

其中:

项目描述
expr用于产生序列中的元素的表达式。
sequence被遍历的序列对象(元祖,列表等)。
item循环变量(被遍历的序列对象中的元素)。
condition布尔表达式(结果值为一个布尔值)。

基本形式(高阶)

判断

在列表推导式中,我们可以使用判断语句来对元素进行筛选。对此,请参考如下示例:

创建包含 0~100 范围内所有为三的倍数的数值的列表

arr = [i for i in range(101) if i % 3 == 0]

print(arr)

执行结果

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
使用逻辑运算符

在列表推导式中,你仍可以使用逻辑推导式来进行更细致的判断。对此,其参考如下示例:

创建包含 0~100 范围内所有为三及五的倍数的数值的列表

arr = [i for i in range(101) if i % 3 == 0 and i % 5 == 0]

print(arr)

执行效果

[0, 15, 30, 45, 60, 75, 90]

笛卡尔积


上述内容引用自 维基百科

接下来,我们将使用列表推导式来实现一副 扑克牌

patterns = ['heart', 'club', 'spade', 'diamond']
symbols = [i for i in range(2, 11)] + list('AJOK')

cards = [(symbol, pattern) for symbol in symbols for pattern in patterns]
print(cards)
print(len(cards))

执行结果

[(2, 'heart'), (2, 'club'), (2, 'spade'), (2, 'diamond'), (3, 'heart'), (3, 'club'), (3, 'spade'), (3, 'diamond'), (4, 'heart'), (4, 'club'), (4, 'spade'), (4, 'diamond'), (5, 'heart'), (5, 'club'), (5, 'spade'), (5, 'diamond'), (6, 'heart'), (6, 'club'), (6, 'spade'), (6, 'diamond'), (7, 'heart'), (7, 'club'), (7, 'spade'), (7, 'diamond'), (8, 'heart'), (8, 'club'), (8, 'spade'), (8, 'diamond'), (9, 'heart'), (9, 'club'), (9, 'spade'), (9, 'diamond'), (10, 'heart'), (10, 'club'), (10, 'spade'), (10, 'diamond'), ('A', 'heart'), ('A', 'club'), ('A', 'spade'), ('A', 'diamond'), ('J', 'heart'), ('J', 'club'), ('J', 'spade'), ('J', 'diamond'), ('O', 'heart'), ('O', 'club'), ('O', 'spade'), ('O', 'diamond'), ('K', 'heart'), ('K', 'club'), ('K', 'spade'), ('K', 'diamond')]
52

拆解

通过在列表推导式中使用多个 for 循环语句并在合适的位点使用合适的循环变量(列表推导式中,相邻的两个 for 循环语句总会使用到同一个变量),我们将能够达到嵌套循环达到的效果。接下来,我们将使用这个特性来将一个二维列表拆解为一维列表。

# 这是一个二维列表
target = [[0, 1, 2],
          [3, 4, 5],
          [6, 7, 8]]

# 我们将通过列表表达式对其进行拆解,
# 将多维列表中的所有元素抽离出来形成单个列表
result = [item for items in target for item in items]
print(result)

执行效果

[0, 1, 2, 3, 4, 5, 6, 7, 8]

变量污染

用于承接从序列中取出的元素的循环变量将被定义在其所处的环境中,这意味着循环变量可能会修改已定义的同名变量的值。对此,请参考如下示例:

constant = 1

for constant in range(101):
    pass

print(constant)

执行结果

在循环过程中,循环变量的改变会导致已有的同名变量发生改变,导致变量被污染。

100

列表推导式

使用列表推导式可以避免循环变量被污染的现象发生。对此,请参考如下示例:

constant = 1

result = [constant for constant in range(101)]

print(constant)

执行效果

1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python---函数的进阶

函数的进阶 1.8函数的进阶 1.8.1函数作为参数进行传入 1.简介:函数作为范围进行传递到函数中进行操作 2.函数作为参数传入到函数中 3.函数调用和逻辑传入之间的区别 一个是作为数据进行传入,但是调用的函数时一定的一个作为逻辑进行调用,但是…

PTA——1036 跟奥巴马一起编程、1037 在霍格沃茨找零钱、1038 统计同成绩学生、1039 到底买不买、1040 有几个PAT

1036 跟奥巴马一起编程 解决代码 模拟题目即可。 #include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){int n;char c;cin>>n>>c;double col(double)n/2;int n0n/2;if(col>n00.4) n01; for(int i0;i&…

华为路由器 基本ACL配置

1、什么是ACL&#xff1f; 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#xff0c;这些条件可以是报文的源地址、目的地址、端口号等。 ACL本质上是一种报文过滤器&…

Android 高通Camera2 Camera Device Close

1、很多人看到这个日志第一感觉可能觉得哪里没有合理释放&#xff0c;于是带着这个思路去进行百度探索 2、一开始我去寻找 ImageReader.OnImageAvailableListener 这个问题 var afterBitmap: Bitmap? null/**监听拍照的图片 */private val imageAvailableListener ImageRead…

GPT免费网站分享(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

从二叉查找树到B*树,一文搞懂搜索树的演进!|金三银四系列

对于准备面试这篇再适合不过了&#xff01;详细讲解了从BST、AVL、红黑树、B树、B树最后到B*树的演进过程&#xff0c;以及各种结构的优劣。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达在面试中&#xff0c;面试官很容易抛出这样的问题…

Java设计模式-2、⼯⼚模式

⼯⼚模式 工厂模式是对简单工厂的一个衍生&#xff0c;解决了许多简单工厂模式的问题。 一、说⼀说简单⼯⼚模式 简单⼯⼚模式指由⼀个⼯⼚对象来创建实例&#xff0c;客户端不需要关注创建逻 辑&#xff0c;只需提供传⼊⼯⼚的参数。 适⽤于⼯⼚类负责创建对象较少的情况&a…

wait讲解

hello啊,今天为大家带来wait的相关介绍 开始正题之前,我们要先进行一点知识点的补充 上一期我们更新了一期关于线程安全的知识,对于volatile在这里在做出一些补充 有些文章上说线程修改一个变量的时候,从主内存读取到工作内存上,在工作内存上修改完以后再返回主内存 由于t1线程…

[数据库原理与应用]educoder-MySQL 单表查询(一)

目录 第1关&#xff1a;用like匹配字符串 第2关&#xff1a;用BETWEEN AND表达查询范围 第3关&#xff1a;空值的判断 第4关&#xff1a;集合运算符IN的应用 第5关&#xff1a;消除重复结果 第6关&#xff1a;聚合函数应用 第7关&#xff1a;分组查询 第8关&#xf…

基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围...

标题有点长&#xff0c;但是基本也说明出了这篇文章的主旨&#xff0c;那就是利用GPT AI智能回答自己设置好的问题 既能实现自己的AI知识库机器人&#xff0c;又能节省ChatGPT调用的token成本费用。 代码仓库地址 document.ai: 基于GPT3.5的通用本地知识库解决方案 下面图片是整…

【数据分析实战】基于python对Airbnb房源进行数据分析

文章目录&#x1f4da;引言&#x1f4d6;数据加载以及基本观察&#x1f4c3;缺失值观察及处理&#x1f516;缺失值观察以及可视化&#x1f516;缺失值处理&#x1f4c3;异常值观察及处理&#x1f4d6;数据探索&#x1f4a1;哪个区域的房源最受欢迎&#xff1f;&#x1f4a1;哪种…

完全二叉树的4种遍历方式

一张二叉树的图 1&#xff0c;二叉树的特点 每个点p的左儿子是p*2,右儿子是p*21&#xff0c;可以分别表示为p<<1与p<<1|1节点的序号是从左到右&#xff0c;从上到下增加的每个点至多2个儿子&#xff08;屁话&#xff08;bushi&#xff09;&#xff09; 2&#xff…

C语言自定义数据类型(六)使用枚举类型

目录 一、定义 二、详解 三、举例说明 一、定义 如果一个变量只有几种可能的值&#xff0c;则可以定义为枚举 (enumeration) 类型&#xff0c;所谓 “ 枚举 ” 就是指把可能的值一一列举出来&#xff0c;变量的值只限于列举出来的值的范围内。 声明枚举类型用 enum 开头。…

UR5 D-H信息 | UR5结构图 | UR5连杆名关节名 | UR5模型信息 | UR5 UDFR信息

这个问题遇到好多次了&#xff0c;不管是仿真还是可视化&#xff0c;都需要我清楚的掌握ur5的URDF信息。但是看官网的Ur5.urdf真的是看的迷迷糊糊的&#xff0c;总是无法把ur5机器人的某个部位和她的名字对应起来。之前都搞不太明白&#xff0c;今天好好整理一下&#xff0c;分…

工赋开发者社区 | 做好生产线的规划与布局,能给工厂带来什么好处?

导读工厂规划布局就是对设备、工作台、物料、工装、半成品、水、电、气等的综合配置&#xff0c;主要是研究工序之间、车间之间以及工厂整体配置的合理性&#xff0c;以达到整个生产系统的人流与物流畅通化、搬运最优化、流程最优化、效率最大化的目标。“想优化工厂空间&#…

NIO Reactor模型(含代码)

概览 我们知道NIO就是调用系统内核的的select/poll/epoll方法来实现&#xff0c;这些系统内核方法会扫描或监控IO&#xff0c;每次将所有的IO的状态返回给NIO线程。让NIO线程可以选择处理读取可读状态的IO流&#xff0c;也可以选择继续监控轮询监控IO的其它状态。 reactor模型也…

【web前端开发】超详细讲解CSS盒子模型

文章目录1.盒子模型介绍2.内容3.边框4.内边距5.⭐盒子大小计算6.⭐内减模式7.外边距外边距的合并外边距的塌陷行内元素的垂直外边距8.⭐清除默认样式9.⭐版心居中1.盒子模型介绍 所有HTML元素可以看作盒子,CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c…

C#多线程锁

背景&#xff1a;再一次测试中用户和我几乎同一时刻&#xff08;不知道谁先谁后&#xff0c;估计间隔在毫秒级&#xff09;操作了系统。 用户那边反馈显示的操作日志是我登录的信息。于是开始查找问题。首先排除了全局变量先后操作被覆盖的原因。首先A账户登录&#xff0c;然后…

基于stm32mp157 linux开发板ARM裸机开发教程3:Cortex-A7 架构与工作模式(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好&#xff0c;但还不能取代专家导师&#xff0c;有时还会犯错&#xff01;ChatGPT 教小狗编程&#xff08; Midjourney 创作&#xff09;GPT-4刚刚发布&#xff0c;相较于GPT-3.5&#xff0c;它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下&#xff0c;能…