列表推导式python菜鸟教程,python使用列表推导式生成包含(i,j)的列表
列表派生,元组派生,字典派生,集合派生列表派生元组派生字典派生集合派生
导数公式(也叫解析器)是Python独有的特性。
演绎可以快速生成列表、元组、字典、集合类型的数据,所以可以细分为列表派生、元组派生、字典派生、集合派生。
演绎列表演绎列表可以使用范围区间、元组、列表、字典、集合等数据类型快速生成满足指定要求的列表。
推导的语法格式如下:
iterable对象中迭代变量的表达式[if条件表达式]]在这种格式中,[if条件表达式]不是必须的,可以使用,也可以省略。
通过列表推演的语法格式,很明显和for循环有一定联系。
实际上,除了[if条件表达式]部分,其他部分的含义和执行顺序与for循环完全相同(表达式实际上是for循环中的循环体),即其执行顺序如下:
迭代对象表达式中的迭代变量可以这样来考虑。只是对for循环语句的格式进行了简单的变换并用[]括起来,但最大的不同是,列表推导最终会形成一个在循环过程中通过计算表达式得到的值的列表。
A_range=range(10)#执行表达式for A_range A _ list=[x * x for x in A _ range]# A _ list集合包含10个元素print(a_list)输出结果:[0,1,4,9,16,25,36,49,64,81]上面代码的第三行将迭代A _ range。由于a_range相当于包含10个元素,所以程序生成的a_list也包含10个元素,每个元素都是a_range中每个元素的平方(由表达式x * x控制)。
不仅如此,我们还可以在列表派生中添加if条件语句,这样列表派生将只迭代那些满足条件的元素。例如:
b _ list=[x * x for x in A _ range if x % 2==0]# A _ list集合包含五个元素print(b_list)输出结果:[0,4,16,36,64]这里,如果在列表推导中加入条件语句,会导致推导只处理范围内的偶数,所以程序生成b _
另外,上面看到的所有列表派生都只有一个循环,但实际上它可以使用多个循环,就像嵌套循环一样。例如,下面的代码:
D _ list=[(x,y)for x in range(5)for y in range(4)]# d _ list列表包含20个元素print(d_list)。在上面的代码中,x是一个遍历range (5)的迭代变量(counter),所以这个x可以迭代五次;Y是遍历range(4)的计数器,所以这个Y可以迭代4次。因此,( x,y)表达式将总共迭代20次。上面的for表达式等效于下面的嵌套循环:
DD _ list=[]for x in range(5):for y in range(4):DD _ list . append((x,y))输出结果:[(0,0),(0,1),(0,2),(0,3),(1,0) (2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(4,0),(4,1),(4,4)
E _ list=[[x,y,z]For x in range(5)For y in range(4)For z in range(6)]# e _ list 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] #只要x能被Y整除,就将它们配对result=[(x,Y)for x in src _ a for Y in src _ b if x % Y==0]print(result)输出结果:[(30,3),(30,5),(12,3),(66,3),(66,11
元组派生的语法格式如下:
(iterable对象中迭代变量的表达式[if条件表达式])用[]括起来的部分可以使用,也可以省略。
对比列表推导,你会发现除了元组推导用()括号把所有部分括起来,而列表推导用[],其他完全一样。而且元组派生和列表派生的用法是完全一样的。
例如,我们可以使用下面的代码生成一个包含数字1~9的元组:
A=(x for x in range(1,10))print(a)输出结果:generator对象gen expr at0x00001 C6E5F9748从上面的执行结果可以看出,使用tuple派生生成的结果不是tuple,而是generator对象,与list派生不同。
如果我们要使用元组派生来获得新元组或新元组中的元素,有以下三种方法:
tuple()函数可以直接将生成器对象转换成元组,例如:a=(x for x in range (1,10)) print (tuple (a))。运行结果为:(1,2,3,4,5,6,7,8,9)。可以直接使用for循环来遍历生成器对象,可以得到各个例如:a=(x for x in range (1,10)) for i in a: print (i,end=) print (tuple (a))输出结果:1 2 3 4 5 6 7 8 9()使用__next__()方法来遍历生成器对象,也可以得到各个元素, 例:a=(x for x in range(3))print(a . _ _ next _ _())print(a . _ _ next _ _())print(a . _ _ next _ _())a=tuple(a)print( converted tuple:,)无论是用for循环遍历生成器对象,还是用_ _ next _ _()方法遍历生成器对象,遍历后原生成器对象都将不复存在,这就是原生成器对象在遍历后被转换,但得到空元组的原因。
在字典推导Python中,字典推导可以在列表、元组、字典、集合、范围区间的帮助下,快速生成符合要求的字典。
字典派生的语法格式如下:
{ iterable对象中迭代变量的表达式[if条件表达式]}如你所见,与其他派生的语法格式相比,唯一的区别是字典派生使用了花括号{}。
Listdemo=[Jack , Tom]#列表中每个字符串的值为key,每个字符串的长度为value,形成一个键值对new dict={ key:len(key)for key in list demo } print(new dict)输出结果:{Jack: 4, Tom: 3}交换现有字典中的每个键值对。
Olddict={jack: 4, tom: 3} newdict={v: k for k,v in old dict . items()} print(new dict)输出结果:{4: Jack ,3: Tom}使用if表达式筛选满足条件的键值对。
Olddict={jack: 4, Tom: 3} newdict={v: k for k,v in olddict . items()if v3 } print(new dict)输出结果:{4: Jack}集合派生的语法格式与字典派生的语法格式完全相同,如下:
{ iterable对象中迭代变量的表达式[if条件表达式]}集合求导和字典求导的格式完全一样,那么给定一个相似的求导,如何判断是哪一个呢?
最简单直接的方法就是根据表情来判断。如果表达式是key:value的形式,证明这个推导是字典推导;反之,则是集合推导。
set={ I * * 2 for I in range(3)} print(set new)输出结果:{0,1,4}由于生成的集合是一个集合,其保存的元素必须是唯一的。
tupledemo=(1,1,2,3,4,5,6,6)set new={ x * * 2 for x in tuple demo if x % 2==0 } print(set new)输出结果:{16,4,36} dictdemo={1:1, 2:2, 3 :3 } set new={ x for x in dict demo。keys()}打印(设置新的)输出结果:{2, 1, 3}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。