"""
1、列表推导式:
作用:快速生成列表
需求1:如何快速生成一个["data0","data1",...,"data99"]的列表
语法:[y for x in xxx]
实现:['data{}'.format(i) for i in range(100)]
等价于:
list1 = []
for x in range(100):
y = 'data{}'.format(x)
list1.append(y)
解释:每遍历一次,就往列表中添加一个y
# 列表推导式
# 通过for循环实现
list1 = []
for i in range(100):
list1.append('data{}'.format(i))
print("用foe循环实现,list1的值为:", list1)
# 通过推导式实现
list2 = ['data{}'.format(i) for i in range(100)]
print("用列表推导式实现,list2的值为:", list2)
常用语法
需求2:如何快速生成一个["data1","data3",...,"data99"]的列表(全是奇数)(使用推导式+if进行过滤)
语法:[y for x in xxx if 条件]
实现:['data{}'.format(i) for i in range(100)if i % 2 == 1]
解释:每遍历一次,就去判断if条件是否成立,若条件成立就往列表中添加一个y
# 推导式+if进行过滤
list3 = ['data{}'.format(i) for i in range(100) if i % 2 == 1]
print("推导式+if进行过滤,list3的值为:", list3)
# 等价于
list1 = []
for x in range(100):
if i % 2 == 1:
y = 'data{}'.format(x)
list1.append(y)
print(list1)
需求3:生成一个["data0","max1","data2","max3",...,"data98","max99"]的列表(推导式+三目运算符)
不同的条件,添加不同的值
语法:[v1 if 条件 else v2 for x in xxx]
实现:['max{}'.format(i) if i % 2 == 1 else 'data{}'.format(i) for i in range(100)]
解释:每遍历一次,就去判断if条件是否成立,若条件成立就往列表中添加一个v1,若条件不成立就往列表中添加一个v2
扩展:推导式里面同时使用if和三目运算符
语法:[三目运算符 for i in xxx if 过滤条件]
解释:每遍历一次,判断if条件是否成立,如果成立去执行三目运算并往列表中写值,如果不成立进入下次循环
建议:
从for循环开始写/看,方便理解和查看
# 推导式+三目运算符
list4 = ['max{}'.format(i) if i % 2 == 1 else 'data{}'.format(i) for i in range(100)]
print("推导式+三目运算符,list4的值为:", list4)
# 等价于
list1 = []
for x in range(100):
if i % 2 == 1:
v1 = 'data{}'.format(x)
list1.append(v1)
else:
v2 = 'max{}'.format(x)
list1.append(v2)
print(list1)
拓展
# 三目运算符
# 语法: v1 if 条件 else v2
# res = v1 if 条件 else v2
# 等价于
# if 条件:
# res = v1
# else:
# res = v2
res = "ok" if 3 > 5 else "no ok"
print(res)
# 集合推导式,集合不能存在重复数据,所以可以用来去重,集合散列(无序)
# {1,2,3,4,5}
# 语法:{i for i in xxx}
res = {i for i in range(10)}
print(res)
2、字典推导式
作用:快速生成字典
需求1:有一个列表li,把它转换为一个元素下标为键,值为元素值的字典格式的数据
li = ["a","b","c","d","e","f","g"]
转换之后的样式:dic = {0:"a",1:"b",....}
语法:{key:value for i in xx}
实现:{index: value for index, value in enumerate(li)}
等价于:
dic = {}
for index, value in enumerate(li):
dic[index] = value
解释:每遍历一次,就往字典中添加一个key:value键值对
# 需求1通过for循环实现
li = ["a", "b", "c", "d", "e", "f", "g"]
dic = {}
for index, value in enumerate(li):
dic[index] = value
print("通过for循环实现需求1", dic)
# 需求1通过内置函数实现
r = enumerate(li) # 获取li下标和索引
print("通过内置函数实现需求1", dict(r)) # 将li的下标和索引转化成list输出
# 需求1使用字典推导式实现
dic2 = {index: value for index, value in enumerate(li)}
print("通过字典推导式实现需求1", dic2)
综合练习:使用字典推导式将下面字符串格式的数据,改造成字典类型的数据 cook_str="BIDUPSID=D0727533D7147B7;PSTM=1530348042;BAIDUID=B1005C9BC2EB28; sugstore=0;__cfduid=d0a13458f8ac2a;BD_UPN=12314353;ispeed_lsm=2;BDORZ=B490B5EBF6F3CD402"
转换后的格式 res = {"BIDUPSID":"D0727533D7147B7","PSTM":"1530348042"....}
# 综合小练习
cook_str = "BIDUPSID=D0727533D7147B7;PSTM=1530348042; BAIDUID=B1005C9BC2EB28; \
sugstore=0;__cfduid=d0a13458f8ac2a;BD_UPN=12314353;ispeed_lsm=2;BDORZ=B490B5EBF6F3CD402"
# for循环实现
dic = {}
cook_str1 = cook_str.split(';')
for item in cook_str1:
k = item.split('=')[0].strip() # strip()去空格的
v = item.split('=')[1]
dic[k] = v
print("综合小练习用for循环实现", dic)
# 推导式实现
res = {item.split('=')[0].strip(): item.split('=')[1] for item in cook_str.split(';')}
print("综合小练习用推导式实现", dic)