Python列表推导式
一、列表推导
列表推导式又称推导列表。列表推导式是以列表为载体,以推导的方式将数据生成并放在列表中。推导即规则,它支持for循环和筛选模式(if判断模式)。设定一个既定规则在列表中进行数据生成,列表推导式比传统方法更为简洁,代价是放弃一部分的可读性。
二、如何声明列表推导式
最简单的列表推导式,列表结构作为一个承载体
1 2 | list_data = [x for x in range ( 10 )] #[0,1,2,3,4,5,6,7,8,9] |
每循环一次,向列表添加一个x的值,直到for全部完成。
三、列表推导式办法与传统方法的比较
推导模式
1 2 3 | list_data = [x for x in range ( 10 )] #[0,1,2,3,4,5,6,7,8,9] print (list_data) |
输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
传统模式
1 2 3 4 | list_data2 = [] for count in range ( 10 ): list_data2.append(count) print (list_data2) |
输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
带判断的列表推导式
1 2 | list_data1 = [ x for x in range ( 10 ) if x % 2 = = 0 ] print (list_data1) |
注意!在列表推导式中没有任何标点符号
for负责数据产生,if负责数据筛选,x负责最终数据输出
输出结果:
[0, 2, 4, 6, 8]
1 2 | list_data = [x for x in range ( 0 , 20 ) if x> 5 ] print (list_data) |
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
1 2 | list_data = [x for x in range ( 0 , 20 ) if x> 5 and x< 15 ] print (list_data) |
[6, 7, 8, 9, 10, 11, 12, 13, 14]
1 2 | list_data2 = [x * * 2 for x in range ( 10 ) if x % 2 = = 0 ] print (list_data2) |
1 2 | list_data = [x + 10 for x in range ( 0 , 20 ) if x % 2 = = 0 ] print (list_data) |
输出结果:
[10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
1 2 | List_data = [(x,y) for x in [ 1 , 2 , 3 , 4 , 5 ] if x> 3 for y in [ 6 , 7 , 8 , 9 , 10 ] ] print (List_data) |
列表推导式的双for循环
1 2 3 4 | list_data1 = [(x,y) for x in range ( 1 , 4 ) for y in range ( 4 , 7 )] print (list_data1) list_data2 = [(x,y) for x in [ 1 , 2 , 3 ] for y in [ 4 , 5 , 6 ]] print (list_data2) |
先看输出的规律:第一个for的第一个元素与第二个for的每个元素进行组合,组合成一个元组
输出:
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
等同于以下函数
1 2 3 4 5 6 | a = [ 1 , 2 , 3 ] b = [ 4 , 5 , 6 ] for x in a: for y in b: list_data.append((x,y)) print (list_data) |
特别注意:
如果返回的是多个值,可以用一个多元数据结构进行返回,如例子中的元组,这样元组可以作为一个元素存在于列表中,推导列表无法一次接受两个元素。
列表推导式的for循环对两层列表进行循环
1 2 3 4 5 6 7 8 9 10 | #列表推导式 data = [[ 1 , 2 , 3 , 4 , 5 ],[ 6 , 7 , 8 , 9 , 10 ]] list_data = [y for x in data for y in x] print (list_data) #传统写法 emplist = [] for x in data: for y in x: emplist.append(y) print (emplist) |
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在字典中进行推导式
1 2 3 4 | dict_data1 = {x: x for x in [ 'name' , 'age' , 'city' ]} print (dict_data1) dict_data2 = { str (x): x for x in [ 1 , 2 , 3 ]} print (dict_data2) |
输出结果:
{'name': 'name', 'age': 'age', 'city': 'city'}
{'1': 1, '2': 2, '3': 3}
四、列表推导式的延伸使用
简单的字典推导式构建,注意!字典推导式不再使用方括弧[]
1 2 3 4 5 6 7 8 9 | #列表推导式的延伸使用 fields = [ '姓名' , '年龄' , '城市' ] info = [ 'zz' , 28 , '上海' ] dict_data = {x:y for x,y in zip (fields,info)} print (dict_data) #传统方法 dict_data = {} for x,y in zip (fields,info): dict_data[x] = y |
输出结果:{'姓名': 'zz', '年龄': 28, '城市': '上海'}
zip函数,俗称压缩,一对一映射
1 2 3 4 5 6 7 8 | #zip函数的使用 fields = [ '姓名' , '年龄' , '城市' ] info = [ 'zz' , 28 , '上海' ] print ( zip (fields,info)) print ( list ( zip (fields,info))) print ( dict ( list ( zip (fields,info)))) dict_data = {x:y for x,y in zip (fields,info)} print (dict_data) |
<zip object at 0x00000275ADE80380>
[('姓名', 'zz'), ('年龄', 28), ('城市', '上海')]
{'姓名': 'zz', '年龄': 28, '城市': '上海'}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #我们先看一下列表的这种操作 my_list1 = [ '5' * 10 ] #观察这个动作实际上是在操作一个元素,并没有对列表进行操作 print (my_list1) #这个动作实际上生成了多个列表并进行了合并 my_list2 = [ '5' ] * 10 #这个动作不可以添加逻辑进去,存在局限性 print (my_list2) #推导列表 my_list = [x for x in range ( 1000 )] print (my_list) # 推导列表的效率,要比传统写法高50%左右 my_list = [] for x in range ( 10000 ): my_list.append(x) print (my_list) |
五、列表推导是举例
数据如下:
1、电视6000、空调15000、洗衣机5000、电冰箱8000
2、床12000、衣柜9000、书桌4000、沙发10000、茶几电视柜5000
3、地面8000、墙面5000、吊顶6000、地板10000
输出要求:
1、计算家用电器的总花销
2、计算家具的总花销
3、计算房屋装修的总花销
4、计算全部的总花销
5、输出花销超过5000的项目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #电器 electrinic_costs = { '电视' : 6000 , '空调' : 15000 , '洗衣机' : 5000 , '电冰箱' : 8000 } #家具 furniture_costs = { '床' : 12000 , '衣柜' : 9000 , '书桌' : 4000 , '沙发' : 10000 , '茶几电视柜' : 5000 } #房屋装修 renovation_costs = { '地面' : 8000 , '墙面' : 5000 , '吊顶' : 6000 , '地板' : 10000 } #独立项目合集 electrinic_cost_sum = [electrinic_cost for electrinic_cost in electrinic_costs.values()] print ( "电器总费用:" + str ( sum (electrinic_cost_sum))) furniture_cost_sum = [furniture_cost for furniture_cost in furniture_costs.values()] print ( "家具总费用:" + str ( sum (electrinic_cost_sum))) renovation_cost_sum = [renovation_cost for renovation_cost in furniture_costs.values()] print ( "房屋装修总费用:" + str ( sum (renovation_cost_sum))) #我们使用copy建立一个新的对象,然后把三个大类放在一起,为计算大于5000的项做好准备 dic_total = electrinic_costs.copy() dic_total.update(furniture_costs) dic_total.update(renovation_costs) #print(dic_total) result_list = [] morethan5000_item = [k for k in dic_total.keys() if dic_total.get(k)> 5000 ] print (morethan5000_item) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)