推导式★★★★★

### 推导式 : 用一行循环判断遍历出一系列数据的方式

通过一行循环判断,遍历出一系列数据的方式是推导式
语法: val for val in Iterable (把想要的值写在 for的左侧)
里面是一行循环判断!根据套在推导式外层的符号判断具体是什么类型的推导式

推导式种类三种:
    [val for val in Iterable]  列表推导式
	{val for val in Iterable}  集合推导式
    {a:b for a,b in iterable}  字典推导式
"""
推导式在使用时,只能用for循环和判断,
而且判断是能是单项判断
"""

列表推导式

lst = [1,2,3,4,5,6,7,8,9]
lst_new = []
for i in range(1,51):
	lst_new.append(i)
print(lst_new)
	lst = [i for i in range(1,51)]
	print(lst)

(1)普通推导式

[1,2,3,4] => [2,8,24,64]
	lst = [1,2,3,4]
lst = [ i * 2**i for i in lst ]
lst = [i << i for i in lst]
print(lst)

(2)带有判断条件的推到式

lst = [1,2,3,4,5,6,67,7,8]
lst_new = []
for i in lst:
	if i % 2 == 0:
		lst_new.append(i)
print(lst_new)

推导式改写

lst = [ i for i in lst if i % 2 == 0 ]
print(lst)

(3)多循环推到式

lst1 = ["王振","黄俊","刘伟"]
lst2 = ["魏小林","刘思敏","陈芮"]
lst_new = []
for i in lst1:
	for j in lst2:
		res = i+"♥"+j
		lst_new.append(res)
print(lst_new)

推导式改写

lst = [i+"♥"+j for i in lst1 for j in lst2]
print(lst)

(4)带有判断条件的多循环推到式

lst_new = []
for i in lst1:
	for j in lst2:
		if lst1.index(i) == lst2.index(j):==>同过值来获取索引相同
			res = i+"♥"+j
			lst_new.append(res)
print(lst_new)

推导式改写

lst = [ i+"♥"+j for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j) ]
print(lst)

### 关于推导式的练习

(1).{'x': 'A', 'y': 'B', 'z': 'C' } 把字典写成x=A,y=B,z=C的列表推导式
dic = {'x': 'A', 'y': 'B', 'z': 'C' }
lst_new = []

常规

for k,v in dic.items():
res = k + "=" + v
lst_new.append(res)
print(lst_new)

lst = [ k + "=" + v for k,v in dic.items() ]
print(lst)

(2).把列表中所有字符变成小写 [“ADDD”,“dddDD”,“DDaa”,“sss”]

常规
lst =  ["ADDD","dddDD","DDaa","sss"]
lst_new = []
for i in lst:
	res= i.lower()
	lst	_new.append(res)
print(lst_new)

lst = [i.lower() for i in lst ]
print(lst)

(3).x是0-5之间的偶数,y是0-5之间的奇数 把x,y组成一起变成元组,放到列表当中

方法一

lst_new = []
for x in range(6):
	for y in range(6):
		if x % 2 == 0 and y % 2 == 1:
			res = x,y
			lst_new.append(res)
print(lst_new)

lst = [ (x,y) for x in range(6) for y in range(6) if x % 2 == 0 and y % 2 == 1 ]
print(lst)

方法二

lst_new = []
for x in range(6):
	if x % 2 == 0:
		for y in range(6):
			if y % 2 == 1:
				res = x,y
				lst_new.append(res)
print(lst_new)

lst = [ (x,y) for x in range(6) if x % 2 == 0 for y in range(6) if y % 2 == 1 ]
print(lst)

(4).使用列表推导式 制作所有99乘法表中的运算

for i in range(9,0,-1):
	for j in range(1,i+1):
		print("{:d}*{:d}={:2d}".format(i,j,i*j) , end=" ")
	print()


lst = [ "{:d}*{:d}={:2d}".format(i,j,i*j) for i in range(9,0,-1) for j in range(1,i+1) ]
print(lst)

(5)#求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 [[2, 4, 6], [12, 15, 18], [28, 32, 36]]

M = [ [1,2,3] , [4,5,6] , [7,8,9]]
N = [ [2,2,2] , [3,3,3] , [4,4,4]]
"""
M[0][0] * N[0][0] = 2
M[0][1] * N[0][1] = 4
M[0][2] * N[0][2] = 6

M[1][0] * N[1][0] = 12
M[1][1] * N[1][1] = 15
M[1][2] * N[1][2] = 18

M[2][0] * N[2][0] = 28
M[2][1] * N[2][1] = 32
M[2][2] * N[2][2] = 36

总结: 能控制下标等于控制了最后的结果

“”"

第一个效果

lst = [ M[i][j] * N[i][j] for i in range(3) for j in range(3) ]
print(lst)

第二个效果

[ [] , [] , [] ] 通过推导式遍历出三个新列表

lst = [ [] for i in range(3) ]
print(lst)

	"""
外层i动的慢的,里层的j动的快的,所以下标M[i][j]
在拿出i的时候, 里面的for 循环了三遍 是在一个新的列表当中实现的;
"""

lst = [ [M[i][j] * N[i][j] for j in range(3)] for i in range(3) ]
print(lst)

### 集合推导式

#自动去重,可以算出种类
#setvar = { 三运运算符 + for i in iterable }
#setvar = {  i for i in iterable }

"""
案例:
	满足年龄在18到21,存款大于等于5000 小于等于5500的人,
	开卡格式为:尊贵VIP卡老x(姓氏),否则开卡格式为:抠脚大汉卡老x(姓氏)	
	把开卡的种类统计出来
"""
listvar = [
	{"name":"王家辉","age":18,"money":10000},
	{"name":"王水机","age":19,"money":5100},
	{"name":"王鹏","age":20,"money":4800},
	{"name":"李站","age":21,"money":2000},
	{"name":"李小龙","age":180,"money":20}
]

setvar = set()
for i in listvar:
	if 18 <= i["age"] <= 21 and  5000 <= i["money"] <= 5500:
		res = "尊贵VIP卡老" +  i["name"][0]
	else:
		res = "抠脚大汉卡老" +  i["name"][0]
	setvar.add(res)
print(setvar)

setvar = { 三运运算符 + for i in iterable }

setvar = {"尊贵VIP卡老" +  i["name"][0] if 18 <= i["age"] <= 21 and  5000 <= 			i["money"] <= 5500 else "抠脚大汉卡老" +  i["name"][0]   for i in listvar }
print(setvar)

### 字典推导式

(1)enumerate

"""
enumerate(iterable,start=0)
功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代	器中
参数:
    iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) 
	   start:  可以选择开始的索引号(默认从0开始索引)
返回值:迭代器
"""

lst = ["吕洞宾","张果老","蓝采和","何仙姑","铁拐李","韩湘子","曹国舅","王哥"]
it = enumerate(lst)

可以设置开始的索引值 start=5

	it = enumerate(lst , start=5)
	from collections import Iterable , Iterator
	res = isinstance(it,Iterator)
	print(res)

for + next 迭代所有数据

	for i in range(3):
		res = next(it)
		print(res)

list强转迭代器

	res = list(it)
	print(res)

1.通过推导式配合enumerate 实现

(5, ‘吕洞宾’)

dic = { k:v for k,v in enumerate(lst , start=1) }
print(dic)

2.通过dict 强转字典 实现

	dic = dict(enumerate(lst , start=1))
	print(dic)

(2)zip

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

特点:不能匹对的多余值会被舍弃
"""

zip 的基本使用

lst1 = ["黄俊","朱佳怡","王振","魏小林"]
lst2 = ["李博","刘伟","王颖倩"]
lst3 = ["刘思敏","陈芮"]
it = zip(lst1 , lst2 )

it = zip(lst1 , lst2 ,lst3 )

print(isinstance(it,Iterator))

用list强转,瞬间拿到里面所有数据

print( list(it) )

1.使用zip配合推导式实现

lst1和lst2反转,键值对也发生变化
dic = {k:v for k,v in  zip(lst1 , lst2 )}
print(dic)

2.通过dict 墙砖字典 实现

dic = dict(zip(lst1 , lst2 ))
print(dic)
Python推导是一种简洁的语法糖,可以从一个数据序列构建另一个新的数据序列。常见的推导包括列表推导、字典推导和集合推导。列表推导可以通过对一个列表进行迭代和筛选操作,生成一个新的列表。字典推导可以通过对一个字典进行迭代操作,生成一个新的字典。而集合推导则可以通过对一个集合进行迭代和筛选操作,生成一个新的集合。推导在数据处理场景中非常常见,并可以大大简化代码的编写和阅读。如果你想了解更多关于推导的语法和用法,请参考引用和引用中提供的链接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python推导简单示例【列表推导、字典推导与集合推导】](https://download.csdn.net/download/weixin_38708361/12865890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python 之推导](https://blog.csdn.net/iprobobo/article/details/123582135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值