Python列表推导式(for表达式)及用法

for 表达式(列表推导式)用于利用其他区间、元组、列表等可迭代对象创建新的列表。

for 表达式的语法格式如下:

[表达式 for 循环计数器 in 可迭代对象]

从上面的语法格式可以看出,for 表达式与普通 for 循环的区别有以下两点:

在 for 关键字之前定义一个表达式,该表达式通常会包含循环计数器。

for 表达式没有循环体,因此不需要冒号。

for 表达式当然也是有循环的,它同样会对可迭代对象进行循环,可迭代对象包含几个对象,该循环就对 for 之前的“表达式”执行几次(相当于 for 之前的表达式就是循环体),并将每次执行的值收集起来作为新的列表元素。

for 表达式最终返回的是列表,因此 for 表达式也被称为列表推导式。

例如如下代码(程序一):

a_range = range(10)
# 对a_range执行for表达式
a_list = [x * x for x in a_range]
# a_list集合包含10个元素
print(a_list)

上面粗体字代码将会对 a_range 执行迭代,由于 a_range 相当于包含 10 个元素,因此程序生成的 a_list 同样包含 10 个元素,每个元素都是 a_range 中每个元素的平方(由表达式 x*x 控制)。

运行上面代码,可以看到如下输出结果:

[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64, 81]

还可以在 for 表达式后面添加 if 条件,这样 for 表达式将只迭代那些符合条件的元素。例如如下代码:

b_list = [x * x for x in a_range if x % 2 == 0]
# a_list集合包含5个元素
print(b_list)

第一行代码与程序一中第 3 行代码大致相同,只是为 for 表达式增加了 if 条件,这样程序只处理 range 区间的偶数,因此程序生成的 b_list 只包含 5 个元素。

运行上面代码,可以看到如下输出结果:

[0 ,4 , 16, 36, 64]

如果将 for 表达式的方括号改为圆括号,for 表达式将不再生成列表,而是生成一个生成器(generator),该生成器同样可使用 for 循环选代。

对于使用圆括号的 for 表达式,它最终返回的是生成器,因此这种 for 表达式也被称为生成器推导式。例如如下代码:

# 使用for表达式创建生成器
c_generator = (x * x for x in a_range if x % 2 == 0)
# 使用for循环迭代生成器
for i in c_generator:print(i, end='\t')
print()

程序中,第 2 行代码只是将 for 表达式的方括号改为圆括号,因此这行代码将会创建一个 generator 对象,接下来程序使用 for 循环遍历了该 generator 对象。运行上面程序,得到如下输出结果:

0 4 16 36 64

在前面看到的 for 表达式都只有一个循环,实际上 for 表达式可使用多个循环,就像嵌套循环一样。例如如下代码:

d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)

上面代码中 x 是遍历 range(5) 的计数器,因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。

运行上面代码,可以看到如下输出结果:

[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

上面的 for 表达式相当于如下嵌套循环:

dd_list = []
for x in range(5):for y in range(4):dd_list.append((x, y))

当然,也支持类似于三层嵌套的 for 表达式,例如如下代码:

e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
# e_list列表包含120个元素
print(e_list)

对于包含多个循环的 for 表达式,同样可指定 if 条件。假如我们有一个需求:程序要将两个列表中的数值按“能否整除”的关系配对在一起。比如 src_a 列表中包含 30,src_b 列表中包含 5,其中 30 可以整除 5,那么就将 30 和 5 配对在一起。对于上面的需求使用 for 表达式来实现非常简单,例如如下代码:

src_a = [30, 12, 66, 34, 39, 78, 36, 57, 121]
src_b = [3, 5, 7, 11]
# 只要y能整除x,就将它们配对在一起
result = [(x, y) for x in src_b for y in src_a if y % x == 0]
print(result)

运行上面代码,可以看到如下输出结果:

[(3, 30), (3, 12), (3, 66), (3, 39), (3, 78), (3, 36), (3, 57), (5, 30), (11, 66), (11, 121)]

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

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

相关文章

什么是JavaScript

文章目录 一、❄️什么是JavaScript?二、❄️JavaScript的特点三、❄️JavaScript的组成🧫1、核心(ECMAScript)🧿2、文档对象模型(DOM)🥏3、浏览器对象模型(BOM&#xff…

深入理解MySQL索引底层数据结构

听课问题(听完课自己查资料) 什么是二叉树 二叉树是怎么存储数据的一个链表是一个集合的数据结构 List是怎么便利找到指定下标元素为什么会快?什么是红黑树 红黑树是怎么存储数据的什么是B TREE 是怎么存储数据的什么是BTREE 是怎么存储数据的 疑惑答案 a. 二叉树…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1)索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2)查询语句较烂 3)关联查询太多join&a…

如何学习TS?

文章目录 一. 8种内置基础类型.ts二. void、never、any、unknown类型void类型never类型any类型unknown类型总结:void和any在项目中是比较常见的,never和unknown不常用。 三. 数组和函数类型定义.ts四. 元组与交叉类型使用元组数组一般有同类型的值组成&a…

ubuntu 20.04 自由切换 python 的版本

问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本,执行 python 时,默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…

url编码未转义导致参数丢失

原来的请求: "&url${ctx}/loanform/risk/loanItemRiskItemReport/main.ht?baseProductType${baseProductType}""&itemReportId"itemReportId修改后: 原因:请求地址拼接时,会判断name为url的属性是…

多模态大模型的前世今生

1 引言 前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作…

Impala4.x源码阅读笔记(三)——Impala如何管理Iceberg表元数据

前言 本文为笔者个人阅读Apache Impala源码时的笔记,仅代表我个人对代码的理解,个人水平有限,文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解,欢迎指正。 上一篇文章Impala4.x源码阅读笔记&#xff0…

simulink代码生成(五)——ePWM模块初级应用

前面分别讲到了SCI及ADC的配置及使用,现在梳理一下ePWM的配置和使用; 先打一些基础的DSP28335的基础知识; F28335 关于ePWM中断与SOC采样信号的一些思考_socasel-CSDN博客 F28335 ePWM模块简介——TMS320F28335学习笔记(四&…

软件开发必知必会的计算机基础

1.计算机基本介绍 1.1 什么是计算机 计算机(Computer)俗称为电脑,计算机是一种高速计算的电子机器,计算机可以进行数值运算,逻辑判断,接收或者是存储信息数据(文本、图片、音频、视频),按照存储在其内部的程序对海量的…

5.微服务代码模型

1.微服务代码模型 代码分层 在微服务代码模型里,我们分别定义了用户接口层、并分别为它们建立了interfaces、application、domain和infrastructure四个一级代码目录; interfaces(用户接口层): 它主要存放用户接口层与前端应用交互、数据转换和交互相关…

Ultra ISO 虚拟光驱修改光盘盘符

windows xp 环境 ultra iso 虚拟光驱修改光盘盘符 method 1. 在ultra iso 中 [选项]->[配置]->[虚拟光驱],在新盘符里选指定盘符 ->[修改] method 2. 打开命令行,进入安装目录,如 "C:\Program Files\UltraISO\drivers"&…

Vue3复习笔记

目录 挂载全局属性和方法 v-bind一次绑定多个值 v-bind用在样式中 Vue指令绑定值 Vue指令绑定属性 动态属性的约束 Dom更新时机 ”可写的“计算属性 v-if与v-for不建议同时使用 v-for遍历对象 数组变化检测 事件修饰符 v-model用在表单类标签上 v-model还可以绑定…

【LMM 002】大型语言和视觉助手 LLaVA-1.5

论文标题:Improved Baselines with Visual Instruction Tuning 论文作者:Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee 作者单位:University of Wisconsin-Madison, Microsoft Research, Columbia University 论文原文:htt…

JavaScript的三种引入的方式

目录 (一).什么是JS1.1JS的特点1.2JS的组成 (二).JS引用的三种方式2.1标签引用(或嵌入式)2.2文件引用(外链式)2.3行内式 (三).JS三种引用方式的优缺点1.行内方式:2.标签引用(或嵌入式):3.文件引…

如何高效查询文件:Linux 下的多种方法详解

如何高效查询文件:Linux 下的多种方法详解 在日常工作中,我们经常需要查找文件,无论是寻找特定的代码文件、配置文件还是其他文档。Linux 提供了多种强大的命令和工具,通过巧妙地使用管道符,我们可以将这些命令组合起来…

连锁门店管理需要信息化系统

连锁门店管理的信息化系统可以提供以下功能,以满足连锁企业日常管理的需求: 1. 连锁线下收银:信息化系统可以提供线下收银功能,包括商品扫码、价格结算、支付方式选择等。通过系统记录每笔交易数据,方便对销售情况进行…

【基于VirtualBox及openEuler20.03 TLS SP1编译openGauss2.1.0源码】

【openEuler 20.03 TLS编译openGauss2.1.0源码】 一、安装环境二、安装步骤 一、安装环境 项目Value虚拟机virtualbox操作系统openEuler 20.03 TLSopenGauss2.1.0openGauss-third_party2.1.0 二、安装步骤 以下操作需要在root用户下执行 编辑/etc/selinux/config vim /etc/s…

C++程序编译

GCC编译器 文章目录 GCC编译器 源文件 为 Main.cpp 注意cpp文件 一定要用g命令 否则没办法执行 预处理(Pre-Processing):首先会经过预处理器将程序中的预编译指令进行处理,然后把源文件中的注释这些没用的东西都给扬了。 g -E Mai…

Qt6.5示例:QMainWindow集成QMenuBar菜单栏

欢迎关注公众号(20YC编程),有免费C视频课程哦! -今日内容- 1 QMenuBar简介 QMenuBar是Qt框架中的一个菜单栏类,它提供了一个可以包含一个或多个QAction对象或级联的QMenu对象的菜单栏。 QMenuBar通常被放置在主窗口的标题栏下方&#xff0…