有一个列表a=[1,2,3],需要得到一个新的列表b=[10,20,30],可以看出将a中的每个元素乘以10就可以得到b中的元素。
按照常规的写法,使用for循环,遍历列表中的每个元素,进行乘以10的操作,再加入列表
如:
a = [1, 2, 3]
b = []
for i in a:
b.append(i*10)
print(b) # 输出[10, 20, 30]
如果使用列表递推式,可以将三行代码浓缩成一行代码,如下
a = [1, 2, 3]
b = [i*10 for i in a]
print(b) # [10, 20, 30]
列表递推式的公式为:
variable = [ out_exp_res for out_exp in input_list if out_exp_condition]
上述表达式可以分为三部分,分别用不同的颜色标注出来了。他们都代表什么意思呢?
out_exp_res:列表variable生成元素的表达式,也可以是一个有返回值的函数。
for out_exp in input_list:迭代input_list,将每次迭代的值out_exp传入到out_exp_res表达式中。
if out_exp_condition(可有可无):为过滤条件,每次迭代的值out_exp满足过滤条件后,再传入到out_exp_res表达式中。
例如,列表a=[1,2,3],需要得到一个新的列表c=[10,30],可以发现只有当a中的元素为奇数时才进行乘以10的运算
a = [1, 2, 3]
b = [i*10 for i in a if i%2 != 0]
print(b) # 输出[10, 30]
列表递推式中,for循环可以嵌套,if判断语句也可以嵌套,但是这样代码的可读性很差,所以当有复杂的嵌套循环和判断时,不适宜用列表递推式。
与列表递推式的公式一样,需要将[]换成()
variable = ( out_exp_res for out_exp in input_list if out_exp_condition )
得到的variable是一个生成器,需要使用tuple()进行转化。
tup_a = (i*2 for i in range(9) if i%2 == 0)
print(tup_a) # 得到的是一个生成器,输出 at 0x1047d0040>
# 使用tuple()进行转化
print(tuple(tup_a)) # 输出(0, 4, 8, 12, 16)
可以从任何以键值对作为元素的可迭代对象中构建出字典。
字典推导式,也是创建字典的一种途径。
他的语法结构:
variable = { out_exp_res for out_exp in input_list if out_exp_condition }
用大括号包围,第一部分为所需要提取和赋值的键值对,再就是循环语句,再就是逻辑分支语句(没有可不写),与列表递推式类似。
例如:
# 使用字典递推式创建一个字典
d = {k:v for k,v in [('name','qq'),('age','13')] }
print(d)
# 输出{'name': 'qq', 'age': '13'}
例一:给定一个字典对象{'a': 1, 'b': 2, 'c': 3},找出其中所有大于 1 的键值对,同时 value 值进行平方运算。
# # 未使用字典推导式的写法
dc = {'a': 1, 'b': 2, 'c': 3}
d_old = dict()
for k, v in dc.items():
if v > 1:
d_old[k] = v ** 2
print(d_old) # 输出{'b': 4, 'c': 9}
# 使用字典推导式
d_new = {k : v ** 2 for k,v in dc.items() if v > 1 }
print(d_new) # 输出{'b': 4, 'c': 9}
例二:给定一个字典对象,请使用字典推导式,将它的key和value分别进行交换。也就是key变成值,值变成key。
# 输入: {'a': 1, 'b': 2, 'c': 3}
# 输出: {1: 'a', 2: 'b', 3: 'c'}
dic_a = {'a': 1, 'b': 2, 'c': 3}
dic_b = {v:k for k,v in dic_a.items()}
print(dic_b) # 输出{1: 'a', 2: 'b', 3: 'c'}
与字典递推式一致,
variable = { out_exp_res for out_exp in input_list if out_exp_condition }
与字典递推式的区别在于out_exp_res,字典递推式的out_exp_res是一个键值对,反之则是集合递推式
s = {n*2 for n in range(4)}
print(s) # 输出{0, 2, 4, 6}
集合推导式中的元素必须是唯一的
tup = (1,1,2,2,3,4,5,6)
s = {i**2 for i in tup if i%2==0}
print(s) # 输出{16, 4, 36}