推导式
推导式介绍
推导式的范围:只支持 列表,字典,集合 这三个可变类型的序列
作用:1.利用其他可迭代(可遍历)的对象创建一个新的列表,字典,或者集合
2.可对得到的元素进行转换或者筛选。
3. 简化代码
原理:类似for循环
列表推导式
语法
列表推导式语法:
变量名 = [表达式 for 变量 in 可迭代对象] 或者 变量名 = [表达式 for 变量 in 可迭代对象 for 变量 in …]
变量名 = [表达式 for 变量 in 可迭代对象 if 条件]
可迭代对象就是可以遍历的对象,如list列表,set集合,str字符串,tuple元组,dict字典等
执行流程
执行流程:
1.把可迭代对象中遍历出来的内容给变量,然后表达式根据变量值进行逻辑运算。
2.或者先把可迭代对象中遍历出来的内容给变量,然后对这个变量值进行判断,符合的条件的值在给表达式
案例
题目1:将下面list1列表中的每一个元素进行平方后放入到一个新列表中
list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 先用普通方式1
new_list1 = [] # 声明一个空列表
i = 0
while i < len(list1):
new_list1.append(i * i)
i += 1
print(f"题目一的方式一:{new_list1}")
# 用普通方式2
new_list2 = []
for j in list1:
new_list2.append(j * j)
print(f"题目一的方式二:{new_list2}")
# 使用推导式解题 3 变量名=[表达式 for 变量 in 列表]
new_list3 = [i * i for i in list1]
print(f"题目一的方式三:{new_list3}")
# 在简化一下
print([i * i for i in list1])
# 通过上面的代码发现,while用了6行,for循环4行,而推导式只需一行就可以达到相同的效果
题目2:筛选出list1中的元素是奇数的值,然后放入到一个新列表中
list1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 普通方式1
new_list4 = []
for j in range(0, len(list1)):
if j % 2 == 1:
new_list4.append(j)
print(f"题目二的方式一:{new_list4}")
# 推导式2 变量名 = [表达式 for 变量 in 列表 if 条件]
new_list5 = [i for i in list1 if i % 2 == 1]
print(f"题目二的方式二:{new_list5}")
题目3:将嵌套列表lis1转换成一个一维列表。
lis1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 普通方式1
new_lis1 = [] # 声明空列表
for i in lis1: # 嵌套for循环遍历出每个元素
for j in i:
new_lis1.append(j)
print(f"题目三的方式一:{new_lis1}")
# 推导式 2 变量名 = [表达式 for 变量 in 列表 for 变量 in 列表]
new_lis2 = [j for i in lis1 for j in i]
print(f"题目三的方式二:{new_lis2}")
# 通过上面的三个题发现,使用推导式会让代码变得更简洁
打印以上结果
题目一的方式一:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
题目一的方式二:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
题目一的方式三:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
-----------------------------------------------------------------------------------
题目二的方式一:[1, 3, 5, 7, 9]
题目二的方式二:[1, 3, 5, 7, 9]
-----------------------------------------------------------------------------------
题目三的方式一:[1, 2, 3, 4, 5, 6, 7, 8, 9]
题目三的方式二:[1, 2, 3, 4, 5, 6, 7, 8, 9]
集合推导式
语法
集合推导式语法:
变量名={表达式 for 变量 in 可迭代对象} 或者 变量名 = {表达式 for 变量 in 可迭代对象 for 变量 in …}
变量名 = {表达式 for 变量 in 可迭代对象 if 条件}
执行流程
集合的推导式与列表的非常相似,唯一区别在于用{}代替[]。而且set集合还有去重的功能
案例
题目1:使用其他序列创建一个新的集合序列
# 集合
set1 = {1, 1, 2, 2, 2, 3, 4, 5, 5, 6, 7}
set2 = {i for i in set1}
print(set2)
# 字符串
str1 = "42314124312"
set3 = {i for i in str1}
print(set3)
# 元组
tup1 = (1, 3, 4, 4, 5, 6, 6, 7)
set4 = {i for i in tup1}
print(set4)
# 列表
list1 = [0, 1, 2, 3, 4, 5, 6, 7]
set5 = {i for i in list1}
print(set5)
# 字典
dict01 = {"k1": "v1", "k2": "v2", "k3": "v3"}
set6 = {i for i in dict01}
print(set6)
# 注意:使用推导式把字典转为新的集合推导式,只有字典的key被转入
打印以上结果
{1, 2, 3, 4, 5, 6, 7}
{'2', '3', '4', '1'}
{1, 3, 4, 5, 6, 7}
{0, 1, 2, 3, 4, 5, 6, 7}
{'k1', 'k3', 'k2'}
字典推导式
语法
字典的推导式:
变量名 = {表达式 for 变量key,变量value in 可迭代对象 …}
变量名 = {表达式 for 变量key,变量value in 可迭代对象 if 条件}
执行流程
字典的推导式也是列表推导式思想的延续,语法相似。
题目1:使用字典推导式创建一个新的字典
# 把字典dict1的元素
dict1 = {"name": "xy", "age": 20, "height": 1.61}
# 普通方法:
dict2 = {}
for k, v in dict1.items():
dict2[k] = v
print(dict2)
# 推导式:
dict3 = {k: v for k, v in dict1.items()}
print(dict3)
打印以上结果
{'name': 'xy', 'age': 20, 'height': 1.61}
{'name': 'xy', 'age': 20, 'height': 1.61}