一、    引言

经过前几个章节的介绍,终于把与列表解析的前置内容介绍完了,本节老猿将列表解析、字典解析、集合解析进行统一的介绍。

前面章节老猿好几次说到了要介绍列表解析,但老猿认为涉及知识层面比较多,一推再推,给人的印象就是这个很复杂,其实整理完成后老猿发现其实很简单。所谓解析/解析式,也称为推导/推导式,对应英语单词为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)]

本节老猿详细总结了列表解析、集合解析、字典解析的概念及语法,并结合案例进行了说明。为了理解相关概念,老猿查了很多的资料,结合自己的理解总结出来这三种解析的定义及语法。其实理解之后,解析就是很简单的事情,希望老猿的介绍能帮助大家快速理解这三种解析。

     老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。 

欢迎大家批评指正,谢谢大家关注!

第4.4节 Python解析与推导:列表解析、字典解析、集合解析的更多相关文章

  1. python数据结构-如何在列表、字典、集合中根据条件筛选数据

    如何在列表.字典.集合中根据条件筛选数据 问题举例: 过滤列表[1, 2, 5, -1, 9, 10]中的负数 筛选字典{“zhangsan”:97, "lisi":80, &qu ...

  2. python容器类型:列表,字典,集合等

    容器的概念我是从C++的STL中学到的 什么是容器? 容器是用来存储和组织其他对象的对象. 也就是说容器里面可以放很多东西,这些东西可以是字符串,可以是整数,可以是自定义类型,然后把这些东西有组织的存 ...

  3. python中元组、列表、字典、集合知识

    像列表一样处理字符串: 仅需要看字符串的首字符就知道如何处理该字符串的情况也很常见.例如,如果有一个姓与名的列表,您可以使用与列表相同的语法查看名与姓的第一个字符.这种看待字符串的方法叫做分片(sli ...

  4. python基础之02列表/元组/字典/set集合

    python中内置的数据类型有列表(list)元组(tuple)字典(directory). 1 list list是一种可变的有序的集合.来看一个list实例: #第一种方法: >>&g ...

  5. python实例:在列表,字典,集合中,根据条件筛选数据

    1. 从列表中过滤掉 负数 from random import randint # 随机生成列表 data = [randint(-10, 10) for _ in range(10)] print ...

  6. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...

  7. python进阶---列表、字典、集合相关操作

    基本概念 列表 序列是python中一个基本的数据结构,每个元素都有一个索引index 操作 # 创建列表 list = [] # 修改列表 list[2] = 2001 # 删除列表 del lis ...

  8. Python强化训练笔记(一)——在列表,字典,集合中筛选数据

    列表,字典,集合中根据条件筛选数据,如下所示 列表:[-10,2,2,3,-2,7,6,9] 找出所有的非负数 字典:{1:90,2:55,3:87...} 找出所有值大于60的键值对 集合:{2,3 ...

  9. Python中多个列表与字典的合并方法

    Python中多个列表与字典的合并方法 1多列表的合并 1)a+=b a=['] b = ['] a += b print(a) >>>['] 2) a.extend(b) a=[' ...

  10. Python 元祖、列表、字典、文件(转载)

    转自http://yangsq.iteye.com/category/20857 python的元组.列表.字典数据类型是很python(there python is a adjective)的数据 ...

随机推荐

  1. MVC中Cookie的用法(一)

    1创建Cookie 1.1直接创建 Response.Cookies["Account"].Value = "test1"; Response.Cookies[ ...

  2. It is better to have the ability of fast learning

    来自某位大佬: 内功=算法+数据结构+编译原理+操作系统原理+软件工程+英文 十足的自信心+强烈的求知欲+对Programming&&C&&CPP的执着+百折不挠的钻研 ...

  3. fork()系统调用后,对于open()前后父子进程的访问

    一开始我也不是很懂,后来看了一篇别人的博客觉得写得特别好,现在拷贝下来分享一下. 如果换成write函数 如果换成write函数,先open()后fork(),那么父子进程共享文件描述符,即使在子进程 ...

  4. 虚拟DOM与diff算法

    虚拟DOM与diff算法 虚拟DOM 在DOM操作中哪怕我们的数据,发生了一丢丢的变化,也会被强制重建整预DOM树.这么做,涉及到很多元素的重绘和重排,导致性能浪费严重 只要实现按需更新页面上的元素即 ...

  5. 最长回文子串的Manacher算法

    对于一个比较长的字符串,O(n^2)的时间复杂度是难以接受的.Can we do better? 先来看看解法2存在的缺陷. 1) 由于回文串长度的奇偶性造成了不同性质的对称轴位置,解法2要对两种情况 ...

  6. 适合 Go 新手学习的开源项目——在 GitHub 学编程

    作者:HelloGitHub-小鱼干&卤蛋 故事要从 2007 年说起.因为受够了 C++ 煎熬的 Google 首席软件工程师 Rob Pike 召集 Robert Griesemer 和 ...

  7. 创建Grafana监控视图

    前言 Grafana允许查询,可视化,警报和了解指标,无论它们存储在哪里. 可视化:具有多种选项的快速灵活的客户端图.面板插件提供了许多不同的方式来可视化指标和日志. 动态仪表盘:使用模板变量创建动态 ...

  8. 预估Ceph集群恢复时间

    一.前言 本章很简单,就是预估集群恢复的时间,这个地方是简单的通过计算来预估需要恢复的实际,动态的显示 二.代码 #!/usr/bin/env python # -*- coding: UTF-8 - ...

  9. 源码分析:升级版的读写锁 StampedLock

    简介 StampedLock 是JDK1.8 开始提供的一种锁, 是对之前介绍的读写锁 ReentrantReadWriteLock 的功能增强.StampedLock 有三种模式:Writing(读 ...

  10. CSS opacity设置不透明度

    1.opacity设置不透明度 opacity会将含有这个属性的子类都变成具有opacity属性,可以改变元素.元素内容.字标签的不透明度.而rgba只会改变设置的那个背景颜色的透明度效果 <! ...