Python 程序设计讲义(51):Python 的推导式

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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睿思达DBA_WGX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值