【Python】推导式

推导式(comprehensions),又称解析式。利用列表推导式、字典推导式、集合推导式可以从一个数据对象构建另一个新的数据对象。利用生成器推导式可以构建生成器对象。
在这里插入图片描述

列表推导式

列表推导式(list comprehension)是Python开发时用得最多的技术之一,表示对可迭代(Iterable)对象的元素进行遍历、过滤或再次计算,生成满足条件的新列表。它的结构是在一个方括号里包含一个函数或表达式(再次计算),接着是一个for语句(遍历),然后是0个或多个for(遍历)或者if语句(过滤),在逻辑上等价于循环语句,但是形式上更简洁。
语法形式:
[function / expression for value1 in Iterable1 if condition1
for value2 in Iterable2 if condition2
……
for valuen in Iterablen if conditionn ]
1.列表推导式和循环语句for

这里是引用
这里是引用

2.列表推导式和条件语句if
在列表推导式中,条件语句if对可迭代(Iterable)对象中的元素进行筛选,起到过滤的作用。


>>> n=[10,-33,21,5,-7,-9,3,28,-16,37]
>>> number=[i*2 for i in n if i>0]
>>> number
[20, 42, 10, 6, 56, 74]

在列表推导式中使用if else语句

>>> n=[10,-33,21,5,-7,-9,3,28,-16,37]
>>> number=[i*2 if i%2==0 else i*3 for i in n if i>0]
>>> number
[20, 63, 15, 9, 56, 111]

3.列表推导式和函数function
在列表推导式中可以使用函数function

>>> import random
>>> rlist=[random.randint(30,80) for i in range(15)] #使用randint()函数
>>> rlist
[30, 45, 68, 60, 73, 49, 66, 72, 66, 33, 52, 52, 61, 42, 51]
>>> def ff(x):
	        if x%3==0:
		        x/=3
	        elif x%7==0:
		        x*=2
	        else:
		        x*=5
	        return x
 
>>> number=[ff(i) for i in rlist] #使用自定义的ff()函数
>>> number
[10.0, 15.0, 340, 20.0, 365, 98, 22.0, 24.0, 22.0, 11.0, 260, 260, 305, 14.0, 17.0]

4.同时遍历多个列表或可迭代对象

>>> score1=[86,78,98,90,47,80,90]
>>> score2=[87,78,89,92,90,47,85]
>>> nn=[(i,j) for i in score1 if i>=90 for j in score2 if j<=85]
>>> nn
[(98, 78), (98, 47), (98, 85), (90, 78), (90, 47), (90, 85), (90, 78), (90, 47), (90, 85)]

字典推导式

字典推导式和列表推导式的使用方法类似,只不过将方括号变成花括号,并且需要两个表达式,一个生成键,一个生成值,两个表达式之间使用冒号分隔,最后生成的是字典。
语法形式:
{key_expression: value_expression for value1 in Iterable1 if condition1]
for value2 in Iterable2 if condition2
……
for valuen in Iterablen if condition}

例如,列表name存储若干人的名字(唯一),列表score在对应的位置上存储这些人的成绩,利用字典推导式,以名字为键、成绩为值组成新字典dd。

>>> name= ['Bob','Tom','Alice','Jerry','Wendy','Smith']
>>> score=[86,78,98,90,47,80]
>>> dd={i:j for i,j in zip(name,score)}
>>> dd
{'Bob': 86, 'Tom': 78, 'Alice': 98, 'Jerry': 90, 'Wendy': 47, 'Smith': 80}

以名字为键、成绩为值组成新字典exdd,新字典中的键值对只包含成绩80及以上的。

>>> exdd={i:j for i,j in zip(name,score) if j>=80}
>>> exdd
{'Bob': 86, 'Alice': 98, 'Jerry': 90, 'Smith': 80}

在上面生成的字典dd中挑出成绩及格的组成新字典pdd。

>>> pdd={i:j for i,j in dd.items() if j>=60}
>>> pdd
{'Bob': 86, 'Tom': 78, 'Alice': 98, 'Jerry': 90, 'Smith': 80}

以名字为键、名字的长度为值组成新字典nd

>>> nd={i:len(i) for i in name}
>>> nd
{'Bob': 3, 'Tom': 3, 'Alice': 5, 'Jerry': 5, 'Wendy': 5, 'Smith': 5}

集合推导式

集合也有自己的推导式,跟列表推导式类似,只不过将方括号变成花括号,最后生成的是集合。
语法形式:
{function / expression for value1 in Iterable1 if condition1
for value2 in Iterable2 if condition2
……
for valuen in Iterablen if conditionn }
在这里插入图片描述

生成器推导式

生成器推导式用法与列表推导式类似,把列表推导式的方括号改成圆括号。它与列表推导式最大的区别是:生成器推导式的结果是一个生成器对象,是一种迭代器(Iterator);而列表推导式的结果是一个列表。
生成器对象可以通过for循环或者__next__()方法、next()函数进行遍历,也可以转换为列表或元组,但是不支持使用下标访问元素,已经访问过的元素也不支持再次访问。当所有元素访问结束之后,如果想再次访问就必须重新创建该生成器对象。

>>> gen=(int(i/3) for i in range(1,10) if i%3==0)
>>> gen
<generator object <genexpr> at 0x0000000002F0BB88>
>>> list(gen) #生成器对象转换为列表
[1, 2, 3]

>>> gen.__next__() #不能再次访问
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    gen.__next__()
StopIteration

>>> gen=(int(i/3) for i in range(1,10) if i%3==0) #重新生成生成器对象
>>> gen.__next__()  #访问下一个元素
1
>>> next(gen)       #访问下一个元素
2
>>> gen.__next__()
3
>>> next(gen)        #访问完毕,不能再次访问
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    next(gen)
StopIteration

>>> gen=(int(i/3) for i in range(1,10) if i%3==0)
>>> for i in gen:       #for循环遍历
	        print(i,end=' ')
1 2 3

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python推导是一种简洁的语法糖,可以从一个数据序列构建另一个新的数据序列。常见的推导包括列表推导式、字典推导和集合推导列表推导式可以通过对一个列表进行迭代和筛选操作,生成一个新的列表。字典推导可以通过对一个字典进行迭代操作,生成一个新的字典。而集合推导则可以通过对一个集合进行迭代和筛选操作,生成一个新的集合。推导在数据处理场景中非常常见,并可以大大简化代码的编写和阅读。如果你想了解更多关于推导的语法和用法,请参考引用和引用中提供的链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python推导简单示例【列表推导式、字典推导与集合推导】](https://download.csdn.net/download/weixin_38708361/12865890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python推导](https://blog.csdn.net/iprobobo/article/details/123582135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值