推导式的作用:快速生成数据
运行过程:
1、创建一个空的结果容器,例如一个列表
2、从迭代器中逐个获取元素
3、将每个元素赋值给变量i
4、执行表达式,将得到的结果添加到结果容器中
5、重复步骤3、4,直到迭代器中的所有元素都被处理
6、返回最终的结果容器
一、列表推导式:
需求:快速生成一个[‘data0’,‘data1’,…,‘data10’]的列表
#常规语法写出来的效果
def normal():
li = []
for i in range(10):
value = 'data{}'.format(i)
li.append(value)
print(li)
1、基础推导式:li = [ i for i in xxx]
def special():
li = ['data{}'.format(i) for i in range(10)]
print(li)
三元/目运算符:
语法:条件成立返回的值 if 条件 else 条件不成立返回的值
示例:name = 1 if 10 > 18 else 0
2、带条件的推导式:
需求:列表中仅包含奇数的部分
- 形式一:
[x for x in xx if 条件]
def special():
li = ['data{}'.format(i) for i in range(10) if i%2!=0]
print(li)
结果:
- 形式二:
[x1 if 条件 else x2 for x in xxx]
需求:生成列表[‘data0’,‘wheat1’,‘data2’,…,‘data8’,‘wheat9’]
def special():
li = ['data{}'.format(i) if i%2==0 else 'wheat{}'.format(i) for i in range(10)]
print(li)
结果:
二、字典推导式
需求:把列表li,转换成元素下标为键,值为元素值的字典格式的数据
def normal():
li = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
dict = {}
for index, value in enumerate(li):
dict[index] = value
print(dict)
enumerate():是一个内置函数,用于将一个可迭代对象(如列表、元组或字符串)组合为一个索引序列,同时返回每个元素的索引和值。常用于需要同时访问元素值和索引的情况,尤其在处理循环时非常有用enumerate(iterable, start=0)
- iterable:要进行枚举的可迭代对象,如列表、元组、字符等
- start(可选):制定索引的起始值,默认为0
1、基础推导式:{key:value for i in xxx}
def special():
res = {f'key{i}':f'value{i}' for i in range(10)}
print(res)
如果需要用到列表中的索引,使用该语句:{index:value for index,value in enumerate(列表表名)}
def special():
li = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
dict = {index:value for index,value in enumerate(li)}
print(dict)
2、带条件的推导式
形式一:{index:value if 条件 else k2,v2 for index,value in xxx}
形式二:{index:value for index:value in xxx if 条件}
三、集合推导式
{ i for i in xxx}
{ i for i in xxx if 条件}
{ i if 条件 else v for i in xxx}
四、生成器表达式
因为元组是不可变的,所以无元组推导式,只有生成器表达式
生成器{ i for i in xxx}
{ i for i in xxx if 条件}
{ i if 条件 else v for i in xxx}
练习题:
1、使用字典推导式将下面字符串格式的数据改成字典类型的数据
#普通写法1
test_str = 'num1=1234qwer;num2=2384hjdsa;num3=fndhusfsh222;num4=fhhuds3333;num5=ijfds444'
li = re.split(';',test_str)
dict = {}
for i in li :
item = i.strip().split('=')
k = item[0]
v = item[1]
dict[k] = v
#for循环内的部分还可以这么写:
key,value = i.split('=')#key,value 这种一次给两个参数赋值的方法叫做多重赋值
dict[key] = value
#推导式写法
#单个for循环实现的方式
test_str = 'num1=1234qwer;num2=2384hjdsa;num3=fndhusfsh222;num4=fhhuds3333;num5=ijfds444'
dict = {i.stri11p().split('=')[0]: i.strip().split('=')[1] for i in test_str.split(';')}
print(dict)
#两个for循环实现的方式
def special():
res1 = [i.strip().split('=') for i in test_str.split(';')]
res = {value[0]:value[1] for value in res1 }
#第二步的另一个方法,可以直接用多重赋值拆包
res = {k:v for k,v in res1}