推导式
又称解析式,利用列表推导式、字典推导式、集合推导式可以从一个数据对象勾见另一个新的数据对象。
列表推导式
对可迭代对象的元素进行遍历、过滤或再次运算,生成满足条件的新列表。
结构:[func/expression for value1 in iterable1 if condition1 for value2 in iterable2 if condition2 … for valueN in iterableN if conditionN]
注:列表推导式中可以使用函数
示例:
#循环语句
n = [1,2,3]
number = []
for i in n:
number.append(i*2)
print(number)
#列表推导式
number2 = [i*2 for i in n]
print(number2)
运行结果:
#循环语句
n = [[1,2,3],[4,5,6]]
number = []
for i in n:
for j in i:
number.append(j*2)
print(number)
#列表推导式
number2 = [j*2 for i in n for j in i]
print(number2)
运行结果:
- 带条件判断的情况
#循环语句
n = [-3,-2,-1,0,1,2,3]
number = []
for i in n:
if i>0:
number.append(i)
print(number)
#列表推导式
number2 = [i for i in n if i>0]
print(number2)
运行结果:
- 带有else的情况
#循环语句
n = [-3,-2,-1,0,1,2,3]
number = []
for i in n:
if i>0:
number.append(i)
else:
number.append(i*2)
print(number)
#列表推导式
number2 = [i if i>0 else i*2 for i in n ]
print(number2)
运行结果:
- 同时遍历多个列表或可迭代对象
#循环语句
n = [1,2,3]
c = ['a','b','c']
nc = []
for i in n:
for j in c:
nc.append((i,j))
print(nc)
#列表推导式
nc2 = [(i,j) for i in n for j in c]
print(nc2)
运行结果:
字典推导式
字典推导式和列表推导式的使用方法类似,需要将方括号变成花括号,并且需要两个表达式,一个生成键,一个生成值,两个表达式之间使用冒号分隔,最后生成的是字典。
在此只举一个简单的例子
#循环语句
name= ['Bob','Tom','Alice','Jerry','Wendy','Smith']
score=[86,78,98,90,47,80]
ns = {}
for i,j in zip(name,score):
ns[i] = j
print(ns)
#字典推导式
dd={i:j for i,j in zip(name,score)}
print(dd)
运行结果:
集合推导式
跟列表推导式类似,将方括号变成花括号即可,最后生成的是集合。
集合推导式和列表推导式的不同点:
list = [i*2 for i in (1,2,3,4,2,1,4)]
print(list)
set = {i*2 for i in (1,2,3,4,2,1,4)}
print(set)
运行结果:
从本例中可以看出,两者的区别在于是否去重(集合推导式会进行去重,并且不重复的排在前面)
生成器推导式
与列表推导式类似,方括号改成圆括号,与列表推导式最大的区别在于生成器推导式的结果是一个生成器对象(一种迭代器,可以转化为列表或元组),不支持用下标访问元素,已访问过的也不支持再次访问。
生成器对象可以通过for循环或者__next__()方法、next()函数进行遍历,也可以转换为列表或元组,但是不支持使用下标访问元素,已经访问过的元素也不支持再次访问。当所有元素访问结束之后,如果想再次访问就必须重新创建该生成器对象。