列表生成式和推导式是一回事?,列表推导式和生成器的区别
导数公式(也叫解析器)是Python独有的特性。演绎公式可以快速生成链表、元组、字典、集合类型的数据,所以演绎公式可以细分为链表派生、元组派生、字典派生、集合派生。
python List Derivative List Derivative可以使用范围区间、元组、列表、字典、集合等数据类型快速生成满足指定要求的列表。
推导的语法格式如下:
iterable对象中迭代变量的表达式[if条件表达式]]
在这种格式中,[if条件表达式]不是必需的,可以使用也可以省略。
通过列表推演的语法格式,很明显和for循环有一定联系。实际上,除了[if条件表达式]部分,其他部分的含义和执行顺序与for循环完全相同(表达式实际上是for循环中的循环体),即其执行顺序如下:
in中的迭代变量可以迭代对象
[if条件表达式]
表示
新手可以这么想。它只是对for循环语句的格式做了一个简单的变形,用[]括起来,但最大的不同是,列表推导最终会形成一个在循环过程中计算表达式得到的一系列值的列表。
例如,下面的代码(程序1):
A_range=range(10) #range(10)等价于range(0,10)#执行表达式for a _ range a _ list=[x * x for x in a _ range]# a _ list集合包含10个元素print(a_list)。上面代码的第三行迭代a_range。由于a_range相当于包含10个元素,所以程序生成的a _ list也包含10个元素,每个元素都是a _
运行上面的代码,您可以看到以下输出结果:
[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64, 81]
不仅如此,我们还可以在列表派生中添加if条件语句,这样列表派生将只迭代那些满足条件的元素。例如,下面的代码:
b _ list=[x * x for x in A _ range if x % 2==0]# A _ list集合包含5个元素。print(b_list)的第一行代码和程序一中的第三行代码大致相同,只是如果在这里的列表推导中加入了条件语句,会导致推导只处理偶数的范围区间,所以程序生成的b_list只包含5个元素。
运行上面的代码,您可以看到以下输出结果:
[0 ,4 , 16, 36, 64]
另外,上面看到的所有列表派生都只有一个循环,但实际上它可以使用多个循环,就像嵌套循环一样。例如,下面的代码:
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), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
当然,它也支持类似于三层嵌套的表达式,如下面的代码:
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] #只要y能被x整除,就把它们配对在一起Result=[(x,y) for x in src _ b for y。
[(3, 30), (3, 12), (3, 66), (3, 39), (3, 78), (3, 36), (3, 57), (5, 30), (11, 66), (11, 121)]
Python元组推导元组推导通过使用范围区间、元组、列表、字典、集合等数据类型,可以快速生成一个满足指定要求的元组。
元组派生的语法格式如下:
(可迭代对象中迭代变量的表达式[if条件表达式])
其中【】括起来的部分可以使用,也可以省略。
对比列表派生,你会发现除了元组派生用()圆括号把各个部分括起来,而列表派生用[],其他完全一样。而且元组派生和列表派生的用法是完全一样的。
例如,我们可以使用下面的代码生成一个包含数字1~9的元组:
A=(x for x in range(1,10))print(a)运行结果为:
位于0x0000020BAD136620的生成器对象genexpr
从上面的执行结果可以看出,使用元组派生生成的结果不是元组,而是生成器对象(后面会介绍),与列表派生不同。
如果我们要使用元组派生来获得新元组或新元组中的元素,有以下三种方法:
使用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(转换后的tuple:,a)
0
一个
2
转换后的元组: ()
注意,无论是使用for循环还是__next__()方法遍历,遍历后原生成器对象都将不复存在,这就是为什么遍历后原生成器对象被转换,但得到的是空元组。
Python字典推导在Python中,字典推导可以用来在列表、元组、字典、集合和范围区间的帮助下快速生成符合要求的字典。
字典派生的语法格式如下:
{可迭代对象中迭代变量的表达式[if条件表达式]}
其中【】括起来的部分可以使用,也可以省略。
如您所见,与其他派生相比,唯一的区别是字典派生使用了花括号{}。
[示例1]
Listdemo=[C语言中文网, c.biancheng.net]#列表中每个字符串的值都是一个键,每个字符串的长度都是一个值,形成一个键-值对new dict={ key:len(key)for key in list demo } print(new dict)。运行结果是:
{C语言中文网:6, c.biancheng.net: 15}
【例2】交换现有字典中键值对的键和值。
Olddict={C语言中文网:6, C . biancheng . net :15 } new dict={ v:k for k,v in old dict . items()} print(new dict)运行如下:
{6: C语言中文网,15: c.biancheng.net}
【例3】if表达式用于过滤合格的键值对。
Olddict={C语言中文网:6, C . biancheng . net :15 } new dict={ v:k for k,v in old dict . items()ifv 10 } print(new dict)运行如下:
{15:边城网 }
Python派生在Python中,集合派生可以用来在列表、元组、字典、集合、值域区间的帮助下快速生成满足要求的集合。
集合派生的语法格式与字典派生的语法格式完全相同,如下所示:
{可迭代对象中迭代变量的表达式[if条件表达式]}
其中【】括起来的部分可以使用,也可以省略。
读者可能会问,集合推导和字典推导的格式是一模一样的,那么给定一个相似的推导,怎么能分辨出哪个是呢?最简单直接的方法就是根据表情来判断。如果表达式是key:value的形式,证明这个推导是字典推导;反之,则是集合推导。
[示例1]
set={ I * * 2 for I in range(3)} print(set new)运行如下:
{0, 1, 4}
【例2】既然生成了一个集合,那么它保存的元素必须是唯一的。
Tuple demo=(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}
[示例3]
Dicdemo={1: 1, 2: 2, 3 :3 } set new={ x for x in dict demo . keys()} print(set new)运行如下:
{2, 1, 3}