推导式(又称解析器),是 Python 独有的一种特性。使用推导式可以快速生成列表、元组、字典以及集合类型的数据,因此推导式又可细分为列表推导式、元组推导式、字典推导式以及集合推导式。
Python列表推导式
列表推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。
列表推导式的语法格式如下:
variable = [out_exp for out_exp in input_list if out_exp == 2]
- out_exp_res:列表生成元素表达式,可以是有返回值的函数。
- for out_exp in input_list:迭代input_list将out_exp传入out_exp_res表达式中。
- if out_exp == 2:根据条件过滤哪些值可以。
dd_list = []
for x in range(5):
for y in range(4):
dd_list.append((x, y))
上面代码中,x 是遍历 range(5) 的迭代变量(计数器),因此该 x 可迭代 5 次;y 是遍历 range(4) 的计数器,因此该 y 可迭代 4 次。因此,该(x,y)表达式一共会迭代 20 次。上面的 for 表达式相当于如下嵌套循环:
d_list = [(x, y) for x in range(5) for y in range(4)]
# d_list列表包含20个元素
print(d_list)
运行上面代码,可以看到如下输出结果:
[(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)]
print ( [x*y for x in range(2,13,2) for y in range(3,14,2) if (x*y) % 3 and (x*y) %5 == 0 ] )
上述代码:找出偶数与奇数相乘的积,即能被3整除又能被5整除的数。
运行结果:
[30, 50, 70, 90, 110, 130]
Python元组推导式
元组推导式的语法格式如下:
(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )
元组推导式和列表推导式的用法完全相同。
例如,我们可以使用下面的代码生成一个包含数字 1~10中奇数 的元组:
a = (x for x in range(1,11,2))
print(a)
运行结果为:
<generator object <genexpr> at 0x0000025BC1161048>
从运行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,这一点和列表推导式是不同的。
如果我们想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:
1. 使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:
a = (x for x in range(1,11,2))
print(tuple(a))
运行结果为:
(1, 3, 5, 7, 9)
2. 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:
a = (x for x in range(1,11,2))
for i in a:
print(i,end=' ')
print(tuple(a))
运行结果为:
1 3 5 7 9 ()
3. 使用 next() 方法遍历生成器对象,也可以获得各个元素,例如:
```python
a = (x for x in range(3))
print(a.__next__())
print(a.__next__())
print(a.__next__())
a = tuple(a)
print("转换后的元组:",a)
运行结果为:
0
1
2
转换后的元组: ()
注意,无论是使用 for 循环遍历生成器 对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。
Python字典推导式
字典推导式的语法格式如下:
variable = {out_exp for out_exp in input_list if out_exp == 2}
和其它推导式的语法格式相比,唯一不同在于,字典推导式用的是大括号{}。
例1.
listdomn = ('你好','世界')
newlist = {key : vlaue for key,vlaue in listdomn}
print(newlist)
运行结果为:
{'你': '好', '世': '界'}
例2. 交换现有字典中各键值对的键和值。
olddict={'今天写多少了': 5, 'www.xiaobai.com': 15}
newdict = {v: k for k, v in olddict.items()}
print(newdict)
运行结果为:
{5: '今天写多少了', 15: 'www.xiaobai.com'}
例 3. 使用 if 表达式筛选符合条件的键值对。
olddict={'今天写多少了': 5, 'www.xiaobai.com': 15}
newdict = {v: k for k, v in olddict.items() if v > 8}
print(newdict)
运行结果为:
{15: 'www.xiaobai.com'}
Python集合推导式
集合推导式的语法格式和字典推导式完全相同,如下所示:
{ 表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] }
由于集合推导式与字典推导式相同,如何区分是那种推导式呢?
最简单的方法是,根据表达式进行判断。如果表达式以键值对(key:value)的形式,则证明此推导式是字典推导式;反之,则是集合推导式。
例1. 既然生成的是集合,那么其保存的元素必须是唯一的。
tupledemo = (1,1,2,3,4,5,6,6)
setnew = {x**2 for x in tupledemo if x%2==0}
print(setnew)
运行结果为:
{16, 4, 36}
例子2. 取出字典中的键,组成新的集合。
dictdemo = {'1':1,'2':2,'3':3}
setnew = {x for x in dictdemo.keys()}
print(setnew)
运行结果为:
{'2', '1', '3'}