一文读懂列表解析、字典解析、集合解析

一、所谓解析/解析式,也称为推导/推导式,对应英语单词为comprehension,是Python的一种独有特性。解析就是从一个数据序列构建另一个新的数据序列的结构体,其本质是使用一个可迭代对象,按一定规则通过表达式、函数等运算后得到一个新的迭代对象,列表解析得到的就是列表对象,字典解析得到的是字典,集合解析得到的是集合。

二、语法释义

1.列表解析:通过解析表达式从一个可迭代对象生成一个新的列表

[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]

其中:

语句中的中括号表示返回数据转换为列表。

expr为计算新列表元素值的表达式

iter_var:表示运算表达式处理的对象所在的容器,解析就是针对在可迭代对象iter_var中的每个元素进行表达式运算后得到的值作为新列表的元素过程;

if cond_exp:表示可迭代对象中的元素需要满足指定条件才会参与表达式运算,如果需要带多个条件,可以在if表达式后再叠加一个if表达式。如:

l=[chr(i+ord('A')) for i in range(26) if i%2==0 if i%3==0 if i%4==0 ]#结果为:['A', 'M', 'Y']

上面例子中:

ord(c)函数:返回字母c的unicode码,ASCII字符返回的就是ASCII码

chr(i)函数:返回一个unicode码对应的字符,0 <= i <= 0x10ffff,如果i是ASCII码的范围则返回ASCII字符

range是上一节介绍的函数,在此用于生成一个0到25的序列迭代的range对象。

上述列表解析的语句表示:用for访问range对象的每个元素i,当元素i能整除2、3、4即能被12整除时,就生成一个字母,该字母的ASCII码值为'A'的ASCII码值加上i的值,按照上述逻辑,i为0、12、 24时满足要求,对应的字母即为结果列表中的元素。

2.集合解析:通过解析表达式从一个可迭代对象生成一个新的集合

{expr for iter_var in iterable }
{expr for iter_var in iterable if cond_expr}

集合解析与列表解析的区别就是将列表解析的中括号换成大括号,以此决定返回值是一个集合,其他的没有什么不同。

注意:集合是会剔重的,如果出现重复值则只保留一个。

3.字典解析:通过解析表达式从一个可迭代对象生成一个新的字典

{key_expr:value_expr for iter_var in iterable }
{key_expr:value_expr for iter_var in iterable if cond_expr }

字典解析也是使用大括号,但是必须在语句中同时指定键和值的计算表达式,确保生成的元素是使用冒号分隔的键-值对,其他的与集合解析类似。其中键的计算表达式为key_expr,值的计算表达式为value_expr。

注意:字典的键必须是唯一的,如果计算元素时出现键重合,如果出现重复值则只保留一个。

举例:用一个数字列表生成数字和字母(计算方法参考上面的例子)映射关系的字典数据

d={i:chr(ord('a')+i) for i in [1,1,2,3]} ?#结果d的值为:{1: 'b', 2: 'c', 3: 'd'}
d={i:chr(ord('a')+i+index) for index,i in enumerate([1,1,2,3])}

#结果d的值为:{1: 'c', 2: 'e', 3: 'g'},enumerate函数请参考上一节的介绍

上面例子可以看到,重复的键1只保留了一个字典元素,该元素保留的是该键最后一个值对应的键-值对。

三、补充说明

1.在生成器一节已经介绍了生成器解析,生成器解析实际上就是生成器表达式,在此不再赘述;

2.在前面介绍时没有提到元组解析,同时当语句外面用小括号时实际对应的是生成器而不是元组,因此Python并没有元组解析这个概念,如果需要通过解析得到元组,可以通过列表解析、生成器解析方式先生成列表或生成器,再通过tuple方法将其转换为元组;

3.虽然用语句循环赋值的方式也能实现上述几种解析方法,但使用解析的方法更精简、运行更快;

4.解析不会改变参数中的原有迭代对象的值;

5.在解析中使用多个for语句等同于多个for循环,如下面代码实现了两个列表生成第三个列表且其元素为前2个列表的笛卡尔积:

numb=[i for i in range(2)]
abc=[chr(ord('a')+k) ?for k in range(2)]
d=[(a,n) for a in abc for n in numb]

 #结果为:

[('a', 0), ('a', 1), ('b', 0), ('b', 1)]

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

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

相关文章

Git的基本操作和原理

目录 写在前面的话 为什么要有Git&#xff08;git初识&#xff09;&#xff1f; Git安装(Centos为例) Git基本操作 创建Git本地仓库 Git配置 认识工作区、暂存区、版本库 概念认识 添加文件 查看.git文件 修改文件 版本回退 撤销修改 情况一&#xff1a;…

[数据集][目标检测]游泳者溺水数据集VOC+YOLO格式2类别895张

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;895 标注数量(xml文件个数)&#xff1a…

博途PLC PID仿真(单容水箱液位高度控制含变积分变增益测试)

单容水箱和双荣水箱的微分方程和数值求解,可以参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/131139432https://rxxw-control.blog.csdn.net/article/details/131139432这篇博客我们利用欧拉求解器在PLC里完成单容水箱的数学建模。PLC也可以和MATL…

SpringBoot Admin 详解

SpringBoot Admin 详解 一、Actuator 详解1.Actuator原生端点1.1 监控检查端点&#xff1a;health1.2 应用信息端点&#xff1a;info1.3 http调用记录端点&#xff1a;httptrace1.4 堆栈信息端点&#xff1a;heapdump1.5 线程信息端点&#xff1a;threaddump1.6 获取全量Bean的…

基于SSM的萌宠宜家商城系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的萌宠宜家商城系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

【黑马程序员】3、TypeScript常用类型_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 3、TypeScript常用类型 3.1 类型注解 …

【51单片机】想学会串口通信,你需要知道这些(串口通信实验前置知识)(13)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

Qt Android sdk配置报错解决

使用的jdk8总是失败&#xff0c;报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17&#xff0c;就配置生效了。Android sdk路径可以选用Android Studio自带的&#xff0c;但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

【黑马程序员】2、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2、TypeScript初体验 2.1 安装编译TS的工…

探究全链路压力测试的含义与重要性

全链路压力测试是指对整个应用系统的各个环节或组件进行压力测试&#xff0c;以模拟实际生产环境中的用户负载和流量&#xff0c;评估系统在高负载条件下的性能表现。 1. 全链路压力测试的含义 全链路压力测试涉及系统的所有组件和环节&#xff0c;包括前端用户界面、应用服务器…

算法沉淀——动态规划之路径问题(leetcode真题剖析)

算法沉淀——动态规划之路径问题 01.不同路径02.不同路径 II03.珠宝的最高价值04.下降路径最小和05.最小路径和06.地下城游戏 01.不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/ 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图…

c++: 用c++语言对车辆进行建模

一 原理 1.1 阿克曼转向模型 转向半径:后轴中心点到原点O的距离 已知道转向半径,可以反求转向角。或者知道转向角,可以求出转向半径。 四个顶点的转向半径。 还要定义这两个参数 1.2 车辆运动的建模 运动写在大的while循环里。 绘制车辆的思路;(1)清

020 基于Spring Boot + Thymeleaf 实现的任务发布网站(源码+数据库)

部分代码地址&#xff1a; https://github.com/XinChennn/xc020-springboot-recruit 基于Spring Boot Thymeleaf 实现的任务发布网站&#xff08;源码数据库&#xff09; 一、系统介绍 雇主&#xff1a;登录、注册、发布任务、选择中标雇员、评价雇员雇员&#xff1a;登录、…

如何解决Nginx启动出现闪退问题?

哈喽&#xff0c;大家好&#xff0c;我是小浪。那么大家首次在启动nginx的时候&#xff0c;绝大部分同学会出现以下情况&#xff0c;就是我们双击nginx.exe文件之后&#xff0c;屏幕闪退一下就没了&#xff0c;然后我们访问localhost:8080提示404. 那么出现这种情况其实是我们…

【深度学习笔记】 3_13 丢弃法

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.13 丢弃法 除了前一节介绍的权重衰减以外&#xff0c;深度学习模型常常使用丢弃法&#xff08;dropout&#xff09;[1] 来应对过拟合…

“点击查看显示全文”遇到的超链接默认访问的问题

今天在做一个例子&#xff0c;就是很常见的点击展开全文。 我觉得这是一个很简单的效果&#xff0c;也就几行代码的事&#xff0c;结果点击了以后立刻隐藏不见&#xff0c;控制台代码也不报错&#xff0c;耽误了我很长时间&#xff0c;最后才发现问题出在超链接身上。 “展开全…

k8s-kubeapps部署 20

部署kubeapps应用&#xff0c;为Helm提供web UI界面管理&#xff1a; 下载最新版本的kubeapps并修改其values.yaml文件 下载并拉取所需镜像&#xff1a; 部署应用 添加解析 修改svc暴露方式为LoadBalancer 得到分配地址 访问http://192.168.182.102 授权并获取token 1.24前的…

osmnx笔记:从OpenStreetMap中提取点和边的shp文件(FMM文件准备内容)

1 导入库 import osmnx as ox import time from shapely.geometry import Polygon import os import numpy as np 2 提取Openstreetmap 的graph Gox.graph_from_place(Huangpu,Shanghai,China,network_typedrive,simplifyTrue) ox.plot_graph(G) 3 提取graph中的点和边 gdf…

pytest如何在类的方法之间共享变量?

在pytest中&#xff0c;setup_class是一个特殊的方法&#xff0c;它用于在类级别的测试开始之前设置一些初始化的状态。这个方法会在类中的任何测试方法执行之前只运行一次。 当你在setup_class中使用self来修改类属性时&#xff0c;你实际上是在修改类的一个实例属性。在Pyth…

《模仿游戏》:天才团队如何破解密码学之谜

引言 计算机科学相关的电影不少&#xff0c;有探索人工智能的《黑客帝国》、还有逻辑和结构学的《盗梦空间》、还有互联网创业的《社交网络》和《硅谷海盗》、还有探索虚拟世界的《源代码》&#xff0c;更甚有国产计算机科学科幻启蒙儿童电视剧《快乐星球》。上述电影充满科技和…