Python列表推导式
一、列表推导
列表推导式又称推导列表。列表推导式是以列表为载体,以推导的方式将数据生成并放在列表中。推导即规则,它支持for循环和筛选模式(if判断模式)。设定一个既定规则在列表中进行数据生成,列表推导式比传统方法更为简洁,代价是放弃一部分的可读性。
二、如何声明列表推导式
最简单的列表推导式,列表结构作为一个承载体
list_data=[x for x in range(10)]
#[0,1,2,3,4,5,6,7,8,9]
每循环一次,向列表添加一个x的值,直到for全部完成。
三、列表推导式办法与传统方法的比较
推导模式
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]
传统模式
list_data2=[]
for count in range(10):
list_data2.append(count)
print(list_data2)
输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
带判断的列表推导式
list_data1=[ x for x in range(10) if x%2==0] print(list_data1)
注意!在列表推导式中没有任何标点符号
for负责数据产生,if负责数据筛选,x负责最终数据输出
输出结果:
[0, 2, 4, 6, 8]
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]
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]
list_data2=[x**2 for x in range(10) if x%2==0] print(list_data2)
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]
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循环
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)]
等同于以下函数
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循环对两层列表进行循环
#列表推导式
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]
在字典中进行推导式
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}
四、列表推导式的延伸使用
简单的字典推导式构建,注意!字典推导式不再使用方括弧[]
#列表推导式的延伸使用
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函数,俗称压缩,一对一映射
#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, '城市': '上海'}
#我们先看一下列表的这种操作
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的项目
#电器
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)

浙公网安备 33010602011771号