16. 推导式

村里唯一的运维 / 2023-05-11 / 原文

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)

image.png

示例2

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

image.png

示例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)

image.png

示例5: 带有条件判断的多循环推导式

x = [ (i,j) for i in range(5) if i >3 for j in range(4) if j >2 ]
print(x)

image.png

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)

image.png
把列表中所有字符变成小写 ["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')

image.png
求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)

image.png
用字典推导式改写

res = { k:v for k,v in enumerate(listvar) }
print(res)

# 用字典强转的方式形成 , 借助enumerate
dictvar = dict(enumerate(listvar,start=100))
print(dictvar)

image.png

zip

zip(iterable, ... ...)
    功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
    iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) 
返回: 迭代器

如果两个列表长度不一样,能配对就就配对,不能的直接舍掉;

示例说明

listvar1 = ["张三","李四","王五"]
listvar2 = ["张三1","李四2","王五3"]
it = zip(listvar1,listvar2)
for i in it:
	print(i)

image.png
用字典推导式改写

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)