一、定义
python的一种独有特性, 推导式是可以从一个数据序列构建另一个新的数据序列的结构体
列表推导式,字典推导式,集合推导式(集合是可变数据类型,集合中的元素是不可变数据类型)
1、列表推导式
提供了简单的生成列表的方法
(1)语法结构
①list = [表达式 for item in 容器]
②list = [表达式 for item in 容器 if 条件]
③list = [表达式 for item1 in 容器1 for item2 in 容器2]
(2)执行流程
①循环遍历出容器中的每个元素item,应用到前边的表达式中,表达式产生的结果为最终列表中的元素
②循环遍历出容器中的每个元素item,使用if判断是否满足条件,满足条件的item应用表达式产生新列表中的元素
③通过两个for循环遍历出容器的元素, 将元素应用到表达式中组成新列表中的元素
1 # 将一个嵌套列表转成一个一维列表
2 list_num = [[1,2,3], [4,5,6], [7,8,9]]
3 list9 = [x for lst in list_num for x in lst]
4 print(list9) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
5
6 # 现有一个列表 list1 = [[1,2,3], [4,5,6], [7,8,9]]
7 # 通过该列表生成一个新列表[1,4,7]
8 # 通过该列表生成一个新列表[2,5,8]
9
10 list10 = [lst[0] for lst in list_num]
11 print(list10) # [1, 4, 7]
12
13 list11 = [lst[1] for lst in list_num]
14 print(list11) # [2, 5, 8]
2、字典推导式
是列表推导式思想的延续, 语法结构差不多, 只不过最终产生的是字典而已
语法结构
dict = { key表达式 : value表达式 for item in 容器}
dict = { key表达式 : value表达式 for item in 容器 if 条件}
dict = { key表达式 : value表达式 for item1 in 容器1 for item2 in 容器2}
1 # 字典, 将字典中的key,value进行互换
2 dict1 = {"name": "rose", "age": 17, "sex": "女"}
3 dict2 = {v: k for k, v in dict1.items()}
4 print(dict2) #{'rose': 'name', 17: 'age', '女': 'sex'}
5
6 # 使用字典推导式, 将list1中的元素作为key, 将list2中的元素作为value, 产生一个字典
7 list1 = ["施耐庵", "吴承恩", "曹雪芹", "罗贯中"]
8 list2 = ["水浒传", "西游记", "红楼梦", "三国演义"]
9 dict3 = {x: list2[list1.index(x)] for x in list1 }
10 print(dict3)
11 dict4 = {list1[x]: list2[x] for x in range(len(list1))}
12 print(dict3)
13
14 # zip() 打包, 将多个可迭代对象(序列)中的相同索引值的元素, 放在一个元组里, 最终将所有的元组组成一个新的可迭代对象
15 dict5 = {k: v for k, v in zip(list1, list2)} # [(施耐庵, 水浒传) (吴承恩,西游记) (曹雪芹,红楼梦) (罗贯中,三国演义)]
16 print(dict5)
3、集合推导式
集合推导式和列表推导式很相似, 唯一的区别就是用{}代替[]
(1)语法结构
①set = {表达式 for item in 容器}
②set = {表达式 for item in 容器 if 条件}
③set = {表达式 for item1 in 容器1 for item2 in 容器2}
(2)特点:自动去重功能
1 list1 = [9, 8, 7, -2, 2, -3, -7, 9]
2 # 使用集合推导式 推导出一个集合 集合中的元素是list1中元素的平方
3 set1 = {x ** 2 for x in list1}
4 print(set1) # {64, 4, 9, 81, 49}