16. 推导式
1. 概述
通过一行循环遍历,得出一系列数据
语法: val for i in Iterable
推导式种类三种:
[val for val in Iterable] 列表推导式
{val for val in Iterable} 集合推导式
{a:b for a,b in iterable} 字典推导式
2. 列表推导式基本用法
示例1
listvar = [1,2,3,4,5]
lst = [ i for i in range(1,6)]
print(lst)

示例2
# [1,2,3,4,5] => [1,8,27,64,125]
lst = [i ** 3 for i in range(1,6)]
print(lst)

示例3: 带有判断条件的推导式 这个条件只能是单项分支
listvar = [1,2,3,4,4,5,6,7,78,8]
"""
lst = []
for i in listvar:
if i %2 == 0:
lst.append(i)
print(lst)
"""
列表推导式改写
lst = [i for i in listvar if i % 2 == 0]
print(lst)
示例4: 多循环推导式
x = []
for i in range(5):
for j in range(3):
x.append((i,j))
print(x)
#推导式改写
res = [ (i,j) for i in range(5) for j in range(3)]
print(res)

示例5: 带有条件判断的多循环推导式
x = [ (i,j) for i in range(5) if i >3 for j in range(4) if j >2 ]
print(x)

3. 列表推导式练习
{'x': 'A', 'y': 'B', 'z': 'C' } 把字典写成x=A,y=B,z=C的列表推导式
dic = {'x': 'A', 'y': 'B', 'z': 'C' }
lst = [ k+"="+v for k,v in dic.items()]
print(lst)

把列表中所有字符变成小写 ["ADDD","dddDD","DDaa","sss"]
lst = ["ADDD","dddDD","DDaa","sss"]
res = [i.lower() for i in lst]
print(res)
x是0-5之间的偶数,y是0-5之间的奇数 把x,y组成一起变成元组,放到列表当中
res = [(x,y) for x in range(6) if x % 2 == 0 for y in range(6) if y % 2 != 0]
res1 = [(x,y) for x in range(6) if x % 2 == 0 for y in range(6) if y % 2 == 1]
print(res,res1,sep='\n')

求M,N中矩阵和元素的乘积
M = [ [1,2,3] , [4,5,6] , [7,8,9] ]
N = [ [2,2,2] , [3,3,3] , [4,4,4] ]
=>实现效果1 [2, 4, 6, 12, 15, 18, 28, 32, 36]
思路
2 => M[0][0] * N[0][0] => 1 * 2
4 => M[0][1] * N[0][1] => 2 * 2
6 => M[0][2] * N[0][2] => 3 * 2
12 => M[1][0] * N[1][0] => 1 * 2
15 => M[1][1] * N[1][1] => 2 * 2
18 => M[1][2] * N[1][2] => 3 * 2
28 => M[2][0] * N[2][0] => 1 * 2
32 => M[2][1] * N[2][1] => 2 * 2
36 => M[2][2] * N[2][2] => 3 * 2
代码实现
lst = [M[i][j]*N[i][j] for i in range(3) for j in range(3)]
print(lst)
4. 字典推导式
enumerate
enumerate(iterable,[start=0])
功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中
参数:
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
start: 可以选择开始的索引号(默认从0开始索引)
返回值:迭代器
示例说明
listvar = ["张三","李四","王五"]
it = enumerate(listvar)
for i in it:
print(i)

用字典推导式改写
res = { k:v for k,v in enumerate(listvar) }
print(res)
# 用字典强转的方式形成 , 借助enumerate
dictvar = dict(enumerate(listvar,start=100))
print(dictvar)

zip
zip(iterable, ... ...)
功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
返回: 迭代器
如果两个列表长度不一样,能配对就就配对,不能的直接舍掉;
示例说明
listvar1 = ["张三","李四","王五"]
listvar2 = ["张三1","李四2","王五3"]
it = zip(listvar1,listvar2)
for i in it:
print(i)

用字典推导式改写
res = { k:v for k,v in zip(listvar1,listvar2) }
print(res)
# 通过dict进行强转;
res = dict(zip(lst1,lst2))
print(res)
把如下字典变成这种格式{"cy":"陈宇","ylp":"优力平" .... }
dic1 = {0:"陈宇",1:"优力平",2:'湖泽',3:"无照"}
dic2 = {"cy":"学霸大大滴棒!","ylp":"学佛","hz":"学饼","wz":"学姐"}
代码实现
res1 = dic1.values() #dict_values(['陈宇', '优力平', '湖泽', '无照'])
res2 = dic2.keys() #dict_keys(['cy', 'ylp', 'hz', 'wz'])
it = zip(res2,res1)
通过字典强行转换
res3 = dict(it)
print(res3)
通过字典推导式转化
res4 = { k:v for k,v in zip(res2,res1) }
print(res4)