python 之 推导式

推导式

概念: 通过一行循环判断,遍历一系列数据的方式叫推导式

语法: val for val in Iterable
三种方式:
		[val for val in Iterable]  列表推导式
		{val for val in Iterable}  集合推导式
		{k:v for k,v in Iterable}  字典推导式

列表推导式基本语法:

例如: 一个列表里需要100条数据
lst= [i for i in range(1,101)]
print(lst)

(1) 单循环推导式

例:[1,2,3,4,5]  =>[3,6,9,12,15]
# 常规写法
lst = [1,2,3,4,5]
lst_new=[]
for i in lst:
	res= i*3
	lst_new.append(res)
print(lst_new)
# 推导式改写
lst=[i*3 for i in lst]
print(lst)	

(2)带有判断条件的单循环推导式(只能是单项分支,接在for后面)

例:[1,2,3,4,5,6,7,8]  =>找出奇数
#常规写法
lst=[1,2,3,4,5,6,7,8]
lst_new=[]
for i in lst:
	if i %2 ==1:
		lst_new.append(i)
print(lst_new)
# 推导式改写
lst=[i for i in lst if i %2 ==1]
print(lst)

(3)双循环推导式

例: lst1 = ["李博伦","高云峰","孙致和","葛龙"]
     lst2 = ["李亚","刘彩霞","刘子豪","刘昕"]
     # "谁"❤"谁"
  # 常规写法
  lst_new= []
  for i in lst1:
  	for j in lst2:
  		strvar = i+"❤"+j
  		lst_new.append(strvar)
  	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):
			strvar =i + "❤" + j
			lst_new.append(strvar)
print(lst_new)
  推导式改写
  lst=[i + "❤" + j for i in lst1 for j in lst2 if lst1.index(i) ==lst2.index(j)]
  print(lst)

集合推导式
集合推导式跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}

案例:
	满足年龄在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":18,"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 = { "尊贵VIP卡老" + i["name"][0] if 18 <= i["age"] <= 21 and  5000 <= i["money"] <= 5500 else "抠脚大汉卡老" + i["name"][0] for i in listvar }
print(setvar)

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

例:lst = ["你好","今天","明天","再见"]
 it= enumerate(lst)
 for + next 调用
 for i in range(4):
 	print(next(it))
# list调用
"""start可以指定开始值,默认是0"""
it = enumerate(lst,start=1)
print(list(it))
# enumerate 形成字典推导式 变成字典
dic = { k:v for k,v in enumerate(lst,start=1) }
print(dic)
# dict 强制变成字典
dic = dict(enumerate(lst,start=1))
print(dic)

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

特征: 如果找不到对应配对的元素,当前元素会被舍弃

基本使用
lst1 = ["张三","李四","王金","小明"]
lst2 = ["今天","明天","昨天","后天"]
lst3=["苹果","桃子","西瓜"]
it = zip(lst1,lst2,lst3)
print(list(it))
# zip 形成字典推导式 变成字典
lst2 = ["今天","明天","昨天","后天"]
lst3=["苹果","桃子","西瓜"]
dic = { k:v for k,v in zip(lst1,lst2) }
print(dic)
# dict 强制变成字典
dic = dict(zip(lst1,lst2))
print(dic)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值