知行编程网知行编程网  2022-11-19 11:00 知行编程网 隐藏边栏  3 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于一文读懂列表解析、字典解析、集合解析的相关知识,包括我读懂了什么一篇作文,以及字典为什么不能作为集合的元素这些编程知识,希望对大家有参考作用。

在一篇文章中理解列表理解、字典解析、集合解析

1、所谓parsing/analytical expression,也称为derivation/derivation,对应英文单词理解,是Python独有的特性。解析就是从一个数据序列构造另一个新的数据序列结构。其本质是使用一个可迭代对象,按照一定的规则计算表达式、函数等后得到一个新的迭代对象,列表解析得到一个列表对象,字典解析结果成字典,集合解析结果成集合。

二、语法释义

1. List Comprehension:通过解析表达式,从可迭代对象生成新列表

[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 是上一节介绍的函数,这里用来生成一个 range 对象,该对象在 0 到 25 的序列上进行迭代。

上面的列表推导语句意思是:用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循环。以下代码实现了两个列表以生成第三个列表,其元素是前两个列表的笛卡尔积:

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)]

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享