推导式
推导式的定义:
推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个
数据序列构建另一个新的数据序列。
推导式包括:1.列表(list)推导式 2.字典(dict)推导式 3.集合(set)推导式。
一、列表(list)推导式
列表推导式(list comprehension)是利用其它列表创建新列表的一种方式,
工作原理类似for循环,即可对得到的元素进行转换或者筛选。
列表推导式的基本格式:
变量名=[表达式 for 变量 in 列表] 或者
变量名= [表达式 for 变量 in 列表 if 条件]
执行流程:
遍历出列表中的内容给变量,表达式根据变量值进行逻辑运算。
或者遍历列表中的内容给变量,然后进行判断,符合的值在给表达式。
列表推导式的应用
1、将lst中每一个元素进行平方后放入到一个新列表中
第一种方式
lst = [1, 2, 3, 4, 5, 6, 7, 8]
# 1
lst_new = [i * i for i in lst]
print(lst_new)
第二种方式
def square(num):
return num * num
new_lst = [square(i) for i in lst]
print(new_lst)
2、 求出lst 中是奇数的值,然后放入到一个新列表中
lst = [1, 2, 3, 4, 5, 6, 7, 8]
lst1 = [i for i in lst if i % 2 == 1]
print(lst1) # [1, 3, 5, 7]
3、求列表中所有大于2的偶数进行平方计算
lst = [1, 2, 3, 4, 5, 6, 7, 8]
new_lst = [i ** 2 for i in lst if i % 2 == 0 if i > 2]
print(new_lst) # [16, 36, 64]
4、 将一个嵌套列表转换成一个一维列表
lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
转换成:lst2=[1, 2, 3, 4, 5, 6, 7, 8, 9]
使用列表推导式
new_lst = [i for lst1 in lst for i in lst1]
print(new_lst)
5、现在有一列表 lst = [[1,2,3],[4,5,6],[7,8,9]]要求出1/4/7 和 1/5/9 元素
lst1 = [lst[i][0] for i in range(len(lst))]
print(lst1)
lst2 = [lst[i][i] for i in range(len(lst))]
print(lst2)
6、面试题
求:a[0](2),a[1](2),a[2](2)的值
a = [lambda x: x * i for i in range(3)]
print(a[0](2))
print(a[1](2))
print(a[2](2))
输出结果都为4
注释: 这里的lambda函数会让后面for循环产生的数字在栈中被覆盖,即for循环产生的数字只会取到最后一个,所以在输出的a[0], a[1], a[2]是同一个数字——2;至于小括号中的数字是对lambda函数中传入的参数,故输出结果都为4。
二、字典推导式
字典推导式列表推导式思想的延续,语法差不多,只不过产生的是字典而已。
字典推导式格式:
变量名={....}
字典推导式的应用
1、将字典中的key和value 进行对换
第一种方法
dic = {'a': 10, 'b': 11}
new_dic = {}
for key, value in dic.items():
new_dic[value] = key
print(new_dic)
第二种方法
dic = {'a': 10, 'b': 10}
new_dic = {value: key for key, value in dic.items()}
print(new_dic)
2、zip()函数
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同
dic = {k:v for k,v in zip(list("ABC"),list("123"))}
#{'A': '1', 'B': '2', 'C': '3'}
三、集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]
栗子:
L = [1,1,1,2,2,2,3,4,5,6,7]
set = {i for i in L}
练习,计算列表中每个值的平方,自带去重功能
squared = {x**2 for x in [1, -1, 2]}
print(squared)
总结
由上面的代码可以看出来,推导式不管是列表,字典还是集合,他们都有着填充序列和简化代码的能力