python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,简化代码,速度快等优点。推导式包括:
1.列表推导式
2.字典推导式
3.集合推导式
4.嵌套列表推导式
注意: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下:
第一:列表推导式
列表推导式也叫列表解析式。
功能:是提供一种方便的列表创建方法,只用一条简洁的表达式即可对得到的元素进行转换变形,所以,列表解析式返回的是一个列表
格式:用中括号括起来,中间用for语句,后面跟if语句用作判读,满足条件的传到for语句前面用作构建先的列表
其基本格式如下:
1 | [expr for value in collection ifcondition] |
过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:
1 2 3 4 | result = [] for value in collection: if condition: result.append(expression) |
例1: 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
1 2 3 | >>> names = [ 'Bob' , 'Tom' , 'alice' , 'Jerry' , 'Wendy' , 'Smith' ] >>> [name.upper() for name in names if len (name)> 3 ] [ 'ALICE' , 'JERRY' , 'WENDY' , 'SMITH' ] |
例2: 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
1 2 | >>> [(x,y) for x in range ( 5 ) if x % 2 = = 0 for y in range ( 5 ) if y % 2 = = 1 ] [( 0 , 1 ), ( 0 , 3 ), ( 2 , 1 ), ( 2 , 3 ), ( 4 , 1 ), ( 4 , 3 )] |
例3: 求M中3,6,9组成的列表
1 2 3 4 5 6 7 8 9 10 11 | >>> M = [[ 1 , 2 , 3 ], ... [ 4 , 5 , 6 ], ... [ 7 , 8 , 9 ]] >>> M [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]] >>> [row[ 2 ] for row in M] [ 3 , 6 , 9 ] #或者用下面的方式 >>> [M[row][ 2 ] for row in ( 0 , 1 , 2 )] [ 3 , 6 , 9 ] |
例4: 求M中斜线1,5,9组成的列表
>>> M [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> [M[i][i] for i in range(len(M))] [1, 5, 9]
例5: 求M,N中矩阵和元素的乘积
>>> M = [[1,2,3], ... [4,5,6], ... [7,8,9]] >>> N = [[2,2,2], ... [3,3,3], ... [4,4,4]] >>> [M[row][col]*N[row][col] for row in range(3) for col in range(3)] [2, 4, 6, 12, 15, 18, 28, 32, 36] >>> [[M[row][col]*N[row][col] for col in range(3)] for row in range(3)] [[2, 4, 6], [12, 15, 18], [28, 32, 36]] >>> [[M[row][col]*N[row][col] for row in range(3)] for col in range(3)] [[2, 12, 28], [4, 15, 32], [6, 18, 36]]
例5: 讲字典中age键,按照条件赋新值
1 2 3 4 5 6 7 | >>> bob { 'pay' : 3000 , 'job' : 'dev' , 'age' : 42 , 'name' : 'Bob Smith' } >>> sue { 'pay' : 4000 , 'job' : 'hdw' , 'age' : 45 , 'name' : 'Sue Jones' } >>> people = [bob, sue] >>> [rec[ 'age' ] + 100 if rec[ 'age' ] > = 45 else rec[ 'age' ] for rec in people] # 注意for位置 [ 42 , 145 ] |
第二:字典推导式
字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:
{ key_expr: value_expr for value in collection if condition }
例1: 用字典推导式以字符串以及其长度建字典
1 2 3 4 | >>> strings = [ 'import' , 'is' , 'with' , 'if' , 'file' , 'exception' ] >>> D = {key: val for val,key in enumerate (strings)} >>> D { 'exception' : 5 , 'is' : 1 , 'file' : 4 , 'import' : 0 , 'with' : 2 , 'if' : 3 } |
例2: 大小写key合并
1 2 3 4 5 6 7 8 | mcase = { 'a' : 10 , 'b' : 34 , 'A' : 7 , 'Z' : 3 } mcase_frequency = { k.lower(): mcase.get(k.lower(), 0 ) + mcase.get(k.upper(), 0 ) for k in mcase.keys() if k.lower() in [ 'a' , 'b' ] } print mcase_frequency # Output: {'a': 17, 'b': 34} |
例3.快速更换key和value
mcase = {'a': 10, 'b': 34} mcase_frequency = {v: k for k, v in mcase.items()} print mcase_frequency # Output: {10: 'a', 34: 'b'}
第三:集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:
1 | { expr for value in collection if condition } |
例1: 用集合推导建字符串长度的集合
1 2 3 | >>> strings = [ 'a' , 'is' , 'with' , 'if' , 'file' , 'exception' ] >>> { len (s) for s in strings} #有长度相同的会只留一个,这在实际上也非常有用 set ([ 1 , 2 , 4 , 9 ]) |
第四:嵌套列表推导式
1 | 嵌套列表是指列表中嵌套列表,比如说: |
1 2 3 | >>> L = [[ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]] |
例1: 一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上字母e的姓名,组成列表
1 2 | names = [[ 'Tom' , 'Billy' , 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' , 'Joe' ], [ 'Alice' , 'Jill' , 'Ana' , 'Wendy' , 'Jennifer' , 'Sherry' , 'Eva' ]] |
用for循环实现:
1 2 3 4 5 6 7 8 9 10 | tmp = [] for lst in names: for name in lst: if name.count( 'e' ) > = 2 : tmp.append(name) print tmp #输出结果 >>> [ 'Jefferson' , 'Wesley' , 'Steven' , 'Jennifer' ] |
用嵌套列表实现:
1 2 3 4 | >>> names = [[ 'Tom' , 'Billy' , 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' , 'Joe' ], [ 'Alice' , 'Jill' , 'Ana' , 'Wendy' , 'Jennifer' , 'Sherry' , 'Eva' ]] >>> [name for lst in names for name in lst if name.count( 'e' )> = 2 ] #注意遍历顺序,这是实现的关键 [ 'Jefferson' , 'Wesley' , 'Steven' , 'Jennifer' ] |
好记忆不如烂笔头
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术