Python 程序设计讲义(51):Python 的推导式
目录
推导式(comprehensions
)又称解析式。表示对可迭代对象的元素进行遍历、过滤或再次计算,生成满足条件的新的可迭代对象。利用列表推导式、字典推导式、集合推导式、元组推导式可以从一个数据对象构建另一个新的数据对象。利用生成器推导式可以构建生成器对象。
一、列表推导式
列表推导式可以利用 range
区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。
列表推导式的语法格式如下:
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
说明:
(1)if 条件表达式
可以省略。
(2)除去 if 条件表达式
部分,其余各部分的含义以及执行顺序和 for
循环是完全一样的(表达式其实就是 for
循环中的循环体),它的执行顺序如下所示:
for 迭代变量 in 可迭代对象:
表达式
可以这样理解:列表推导式只是对 for
循环语句的格式做了一下简单的变形,并用中括号( []
)括起来而已。不同之处在于,列表推导式最终会将循环过程中计算表达式得到的一系列值组成一个新的列表。
列表推导式的几种用法:
1、表达式+for
例如:
l1=["张三","李四","王五","赵六"]
new_l=["name:"+x for x in l1]
print(new_l)
print([x**2 for x in range(10)])
程序的运行结果为:
['name:张三', 'name:李四', 'name:王五', 'name:赵六']
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2、使用 if 条件
例如:
l1=[25,5.8,-74.25,0,52.777,-36.5]
l2=[x*2 for x in l1]
l3=[x*2 for x in l1 if x>0]
print(l2)
print(l3)
程序的运行结果为:
[50, 11.6, -148.5, 0, 105.554, -73.0]
[50, 11.6, 105.554]
3、表达式中可以包含函数
例如:
def func1(x):
if x>100 or x<0:
return '分数错误'
elif x>=90:
return '优秀'
elif x>=80:
return '良好'
elif x>=70:
return '中等'
elif x>=60:
return '及格'
else:
return '不及格'
t1=(50,68,100,88,52.5,78.5,69,92.5,300,79.5)
l1=[func1(x) for x in t1]
print(l1)
程序的运行结果为:
['不及格', '及格', '优秀', '良好', '不及格', '中等', '及格', '优秀', '分数错误', '中等']
4、参数中包含多个列表
例如:
name=("张三","李四","王五","赵六")
score1=[80,90,95.5,75.5]
score2=[88.5,72.5,80,79]
m=[(x,y,z) for x,y,z in zip(name,score1,score2)]
print(m)
m=[[x,y,z] for x,y,z in zip(name,score1,score2)]
print(m)
#下面的格式把三个元组中的元素两两任意组合
m=[[x,y,z] for x in name for y in score1 for z in score2]
程序的运行结果为:
[('张三', 80, 88.5), ('李四', 90, 72.5), ('王五', 95.5, 80), ('赵六', 75.5, 79)]
[['张三', 80, 88.5], ['李四', 90, 72.5], ['王五', 95.5, 80], ['赵六', 75.5, 79]]
[['张三', 80, 88.5], ['张三', 80, 72.5], ['张三', 80, 80], ['张三', 80, 79], ['张三', 90, 88.5], ['张三', 90, 72.5], ['张三', 90, 80], ['张三', 90, 79], ['张三', 95.5, 88.5], ['张三', 95.5, 72.5], ['张三', 95.5, 80], ['张三', 95.5, 79], ['张三', 75.5, 88.5], ['张三', 75.5, 72.5], ['张三', 75.5, 80], ['张三', 75.5, 79], ['李四', 80, 88.5], ['李四', 80, 72.5], ['李四', 80, 80], ['李四', 80, 79], ['李四', 90, 88.5], ['李四', 90, 72.5], ['李四', 90, 80], ['李四', 90, 79], ['李四', 95.5, 88.5], ['李四', 95.5, 72.5], ['李四', 95.5, 80], ['李四', 95.5, 79], ['李四', 75.5, 88.5], ['李四', 75.5, 72.5], ['李四', 75.5, 80], ['李四', 75.5, 79], ['王五', 80, 88.5], ['王五', 80, 72.5], ['王五', 80, 80], ['王五', 80, 79], ['王五', 90, 88.5], ['王五', 90, 72.5], ['王五', 90, 80], ['王五', 90, 79], ['王五', 95.5, 88.5], ['王五', 95.5, 72.5], ['王五', 95.5, 80], ['王五', 95.5, 79], ['王五', 75.5, 88.5], ['王五', 75.5, 72.5], ['王五', 75.5, 80], ['王五', 75.5, 79], ['赵六', 80, 88.5], ['赵六', 80, 72.5], ['赵六', 80, 80], ['赵六', 80, 79], ['赵六', 90, 88.5], ['赵六', 90, 72.5], ['赵六', 90, 80], ['赵六', 90, 79], ['赵六', 95.5, 88.5], ['赵六', 95.5, 72.5], ['赵六', 95.5, 80], ['赵六', 95.5, 79], ['赵六', 75.5, 88.5], ['赵六', 75.5, 72.5], ['赵六', 75.5, 80], ['赵六', 75.5, 79]]
二、元组推导式
元组推导式的语法和列表推导式完全相同。只是把([]
)换成小括号(()
)。元组推导式和列表推导式的用法也完全相同。
元组推导式的语法格式如下:
(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )
例如:
l1=[1,2,3,4]
l2=(x**2 for x in l1)
print(l2)
print(type(l2))
程序的运行结果为:
<generator object <genexpr> at 0x000001BB7C597AC0>
<class 'generator'>
从上面的执行结果可以看出:使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,这一点和列表推导式不同。
如果我们想要使用元组推导式获得新元组,可以使用tuple()
函数转换成一个元组。当然也可以使用list()
函数转换成列表,还可以使用set()
函数转换成集合。
例如:
l1=[1,2,3,4]
l2=(x**2 for x in l1)
l3=(x**2 for x in l1)
print(l2)
print(tuple(l2))
print(list(l3))
程序的运行结果为:
<generator object <genexpr> at 0x0000021524787AC0>
(1, 4, 9, 16)
[1, 4, 9, 16]
三、字典推导式
使用字典推导式可以借助列表、元组、字典、集合以及 range
区间,快速生成符合需求的字典。
字典推导式的语法格式如下:
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
和其它推导式的语法格式相比,不同之处在于,字典推导式用的是大括号{}
。
例如:
l1=(1,2,3,4)
l2=["汉族","回族","蒙古族","哈萨克族"]
l3=("tom","jack","black","jerry","mark")
d11={1:"党员",2:"团员",3:"群众"}
d1={key:value for key,value in zip(l1,l2)}
d2={x:len(x) for x in l3}
d3={value:key for key,value in d11.items()}
print(d1)
print(d2)
print(d3)
程序的运行结果为:
{1: '汉族', 2: '回族', 3: '蒙古族', 4: '哈萨克族'}
{'tom': 3, 'jack': 4, 'black': 5, 'jerry': 5, 'mark': 4}
{'党员': 1, '团员': 2, '群众': 3}
四、集合推导式
集合推导式的语法格式和字典推导式完全相同,如下所示:
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
由于集合推导式和字典推导式的格式完全相同,如果表达式以键值对(key:value
)的形式表示,则推导式是字典推导式;反之,则是集合推导式。
例如:
l1=(1,2,3,4)
l2=["汉族","回族","蒙古族","哈萨克族"]
s1={x**2 for x in l1}
s2={len(x) for x in l2} #消除重复的元素
print(s1)
print(s2)
程序的运行结果为:
{16, 1, 4, 9}
{2, 3, 4}