第十一天 推导式 |
课程:推导式又叫生成式,只有列表、字典、集合有推导式
推导式的作用:简化代码
列表推导式:(又叫列表生成式)
通过用一个表达式创建一个有规律的列表或控制一个有规律的列表
作用:
化简代码,创建或控制有规律的列表
需求:创建一个0-10的列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
三种实现方法,进行比较
写法:
1、准备一个空列表
2、循环将有规律的数据写入列表
# while循环实现
list1 = []
i = 0
while i < 10:
list1.append(i)
i += 1
print(list1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list1 = []
for i in range(10):
list1.append(i)
# list1.extend(i) # 不可以追加,会报错'int' object is not iterable
print(list1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
写法: [i for i in range(10)]里面i相当于返回值
list2 = [i for i in range(10)] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list2)
需求:创建0-10的偶数列表
list = [i for i in range(0,10,2)]
print(list) # [0, 2, 4, 6, 8]
list2 = []
for i in range(10):
if i % 2 == 0:
list2.append(i)
print(list2) # [0, 2, 4, 6, 8]
list = [i for i in range(10) if i % 2 == 0]
print(list) # [0, 2, 4, 6, 8]
注意: 想要追加数据用range(起始,终止,步长)–append(),想要for遍历数据,用列表名或元组名或者集合或者字典或者字符串
需求:输出[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
分析:
左侧数据,外层数据,从1-2,range(1,3);
右侧数据,内层数据,从0-2,range(3)
准备空列表,进行for嵌套循环
# for循环嵌套输出[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
list1 = []
for i in range(1,3):
for j in range(3):
list1.append((i,j))
print(list1)
list2 = [(i,j) for i in range(1,3) for j in range(3)] # 一般使用的是()
print(list2)
备注: list2 = [(i,j) for i in range(1,3) for j in range(3)],此(i,j)还可以写成[i,j] 、{i,j},但不推荐
字典推导式的作用:快速将两个列表合并成一个字典
1、创建字典,key是1-4数字,值是其平方
dict1 = {i:i**2 for i in range(1,5)}
print(dict1) # {1: 1, 2: 4, 3: 9, 4: 16}
list1 = [‘name’,‘age’]
list2 =[‘Tim’,25,‘man’]
合并成’name’: ‘Tim’, ‘age’: 25, ‘gender’: ‘man’}
list1 = ['name','age']
list2 =['Tim',25,'man']
dict1 = {list1[i]:list2[i] for i in range(len(list1))}
print(dict1) # {'name': 'Tim', 'age': 25, 'gender': 'man'}
# len统计数据一样的列表
list1 = ['name','age']
list2 =['Tim',25,'man']
dict1 = {list1[i]:list2[i] for i in range(len(list1))}
# dict1 = {list1[i]:list2[i] for i in range(len(list2))}
print(dict1) # {'name': 'Tim', 'age': 25}
# 2-2len(序列的长度),若是填写的长度比另一个短,那么显示能出现的键值对
list1 = ['name','age']
list2 =['Tim',25,'man']
dict1 = {list1[i]:list2[i] for i in range(len(list1))}
print(dict1) # {'name': 'Tim', 'age': 25}
# 2-2len(序列的长度),若是填写的长度比另一个长,报错
list1 = ['name','age','gender','id']
list2 =['Tim',25,'man']
# dict1 = {list1[i]:list2[i] for i in range(len(list1))}
dict1 = {list1[i]:list2[i] for i in range(len(list2))} # {'name': 'Tim', 'age': 25, 'gender': 'man'}
print(dict1) # 超出列表长度的范围,报错list index out of range
总结:是否会报错,是否会输出能配对的键值对,取决于len(哪个列表)!!!
需求:可以在大量数据中获取到所需目标数据
题目:提取上述电脑数量销售>=200台
方法:for实现+if条件
1、获取所有数据(所有键值对),返回迭代器,
2、迭代器每个键值对内部都是一个元组(key、value)
3、两个临时变量拆包去接收,
4、再加入条件判断,
5、返回值是字典,以键值对形式
for实现+if条件
counts = {'MBP':268,'HP':125,'DELL':201,'Lenovo':199,'acer':99}
dict1 = {key:value for key,value in counts.items() if value>=100}
dict2 = {key:value for key,value in counts.items() if value>=200}
print(dict1) # {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199}
print(dict2) # {'MBP': 268, 'DELL': 201}
for循环后,要返回迭代器的值key,value,写在前面
集合推导式:化简,集合有去重功能
需求:创建一个集合,数据为下方列表的2次方
list1=[1,1,2]
set1={i**2 for i in list1}
print(set1) # {1, 4}
1、推导式的作用:化简复杂循环代码,返回列表、字典、集合
2、返回值,字典的返回值是键值对;集合有去重的功能
3、创建有规律的列表、或控制有规律的列表
4、快速合并列表为字典、提取字典的目标数据
列表推导式
[XX for i in range()]
字典推导式
1、快速合并列表为字典
{list1[i]:list2[i] for i in range(len(list1/2))}
2、提取字典中的目标数据:
{key:value for key,value in count.item() if 条件}
集合推导式
{XX for i in 列表}