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

第一,所谓的分析/分析,也叫推导/推导,对应的英语单词是comprehension,是Python的一个独特特征。分析是从一个数据序列构建另一个新的数据序列结构。其本质是使用可迭代对象,按照一定的规则通过表达式和函数操作获得新的迭代对象。列表分析获得列表对象,字典分析获得字典,集合分析获得集合。
二、语法解释
1.列表分析:通过分析表达式从可迭代对象生成新列表
[exprforiter_variniterable] [exprforiter_variniterableifcond_expr]
其中:
句子中的中括号表示返回数据转换为列表。
expr是计算新列表元素值的表达式
iter_var:表示运算表达式处理对象所在的容器分析是将可迭代对象iter_var中的每个元素表达式操作后获得的值作为新列表的元素过程;
if cond_exp:在参与表达式运算之前,可迭代对象中的元素需要满足指定条件。如果需要多个条件,可以在if表达式之后叠加一个if表达式。例如:
l=[chr(i+ord('A'))foriinrange(26)ifi%2=0ifi%3=0ifi%4=0]#结果为:['A','M','Y']以上例子:
ord(c)函数:unicode码返回字母c,ASCII字符返回ASCIII码
chr(i)函数:返回unicode对应的字符,0 <= i <= 0x10fff,如果i是ASCII码的范围,则返回ASCII字符
range是上一节介绍的函数,用于生成0-25序列迭代的range对象。
上述列表分析的句子表示:使用for访问range对象的每个元素i,当元素i可以删除2时、3、4.当它可以被12排除时,它会生成一个值为'的字母;A'根据上述逻辑,ASCII值加I值为0、12、 满足要求时,相应的字母是结果列表中的元素。
2.集合分析:通过分析表达式从可迭代对象生成新的集合
{exprforiter_variniterable}
{exprforiter_variniterableifcond_expr}集合分析和列表分析的区别在于用大括号代替列表分析的中括号,从而决定返回值是一个集合,其他的没有区别。
注:集合会很重,如果有重复值,只保留一个。
3.字典分析:通过分析表达式从可迭代对象生成新字典
{key_expr:value_exprforiter_variniterable}
{key_expr:value_exprforiter_variniterableifcond_expr}字典分析也使用大括号,但键和值的计算表达式必须同时指定在句子中,以确保生成的元素是使用冒号分离的键-值对,其他元素类似于集合分析。键的计算表达式是key_expr,value_expr。
注:字典的键必须是唯一的,如果键在计算元素时重叠,如果有重复值,则只保留一个。
例如:用数字列表生成字典数据的数字和字母(计算方法参考上述例子)
d={i:chr(ord('a')+i)foriin[1,1,2,3]}#结果d值为:{1:'b',2:'c',3:'d'}
d={i:chr(ord('a')+i+index)forindex,iinenumerate(1,1,2,3)#结果d值为:{1: 'c', 2: 'e', 3: 'g'},请参考上一节的介绍enumerate函数
从上面的例子可以看出,重复键1只保留了一个字典元素,保留了与键最后一个值对应的键-值对。
第三,补充说明
1.生成器分析已在生成器一节介绍,生成器分析实际上是生成器表达式,这里就不赘述了;
2.在前面的介绍中没有提到元组分析。同时,当句子外面有一个小括号时,它实际上对应于生成器而不是元组。因此,Python没有元组分析的概念。如果需要通过分析获得元组,可以通过列表分析和生成器分析形成列表或生成器,然后通过tuple将其转换为元组;
3.虽然上述分析方法也可以通过句子循环赋值来实现,但使用分析方法更简洁、更快地运行;
4.分析不会改变参数中原始迭代对象的值;
5.在分析中使用多个for语句等同于多个for循环。例如,以下代码实现了两个列表生成第三个列表的笛卡尔积,其元素是前两个列表:
numb=[iforiinrange(2)]
abc=[chr(ord('a')+k)?forkinrange(2)]
d=[(a,n)forainabcforninnumb]#结果为:
[('a',0),('a',1),('b',0),('b',1)] 