推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个
数据序列构建另一个新的数据序列。
推导式包括:1.列表(list)推导式 2.字典(dict)推导式 3.集合(set)推导式。
列表推导式(list comprehension)是利用其它列表创建新列表的一种方式,
工作原理类似for循环,即可对得到的元素进行转换或者筛选。
列表推导式的基本格式:
变量名=[表达式 for 变量 in 列表] 或者
变量名= [表达式 for 变量 in 列表 if 条件]
执行流程:
遍历出列表中的内容给变量,表达式根据变量值进行逻辑运算。
或者遍历列表中的内容给变量,然后进行判断,符合的值在给表达式。
第一种方式
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)
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]
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]
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)
lst1 = [lst[i][0] for i in range(len(lst))]
print(lst1)
lst2 = [lst[i][i] for i in range(len(lst))]
print(lst2)
求: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。
字典推导式列表推导式思想的延续,语法差不多,只不过产生的是字典而已。
字典推导式格式:
变量名={....}
第一种方法
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)
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)
由上面的代码可以看出来,推导式不管是列表,字典还是集合,他们都有着填充序列和简化代码的能力