列表推导式
列表推导式是python3中的一个语法糖可用于快速迭代一个可迭代对象并将结果存储在列表中
#基本语法
#iterable是可迭代对象,即可以是list,set之类的序列也可以是实现了__iter__的类
#var用于保存每次从中取到的元素
[var for var in iterable]
#例子,把0到9放到列表中
a = [var for var in range(10)]
#输出:a=[0,1,2,3,4,5,6,7,8,9]
#等效于下面的for语法
a = []
for i in range(10):
a.append(i)
#可以看出利用语法推导式,可以减少代码量,而且语法更加的简洁,
推导式里面嵌套for
推导式里的for可以看做是简洁的for循环,for循环可以嵌套,那么推导式里的for也可以嵌套
#语法
[var2 for var1 in iterable for var2 in var1 ]
#注意,这里的var2是从var1中迭代,也就是说iterable中的元素也是一个可迭代的
#注意:先迭代var1,var1每个里面迭代var2
'''
等效:
for var1 in iterable:
for var2 in var1:
...
'''
#例子:二维列表化为一维列表
a = [[1,2],[3,4],[5,6]]
b = [y for x in a for y in x]
#这里是嵌套的for循环注意和嵌套的推导式的区别
推导式中的判断
当我们迭代时,可以使用if语句来控制是否读取这个元素
#语法
[var for var in iterable if condition]
#例子:把1到10中的所有偶数存到一个列表中
#这里+1是因为range的迭代是左闭右开区间,不加1取不到10
a = [var for var in range(10+1) if var%2==0]
#结果: [0,2,4,6,8,10]
进阶
当我们需要对迭代器中的每个元素都进行处理时,我们也可以使用列表推导式
#高级语法
#func(var)意为对var进行操作,可以是传递给参数也可以直接运算,如var*2
#可以使用比较复杂的表达式,比如 1 if var else 2 var+6
#可以使用函数或里面函数,如 fun(var)
[func(var) for var in iterable]
#例子,把已存在列表的每个数字都进行乘2操作,返回新的列表
a = [1,2,3,4]
b = [var*2 for var in a]
#结果: b=[2,4,6,8]
#以下是等效的
c = [lambda var:var*2 for var in a]
#即是把变量传递给了一个匿名函数,并用返回值作为列表内的值
多维列表
对于多维列表,我们可以看做包含列表的列表,对于多维列表的是否也可以用推导式呢?
答案当然是可以的,这里用到嵌套的推导式
#多维列表推导式语法
[[var2 for var2 in iterable2] for var1 in iterable1]
#可以把iterable1的每次迭代其实都是创建了一个[var2 for var2 in iterable2] 这个列表,它的值并没有使用,即它的迭代次数影响行数
#其中内存的迭代就对应控制列数,还有其中的初始化的值
#例子:建立一个二维列表,行和列都从0到9排列
a = [[j for j in range(10)] i for i in range(10)]
'''
结果:
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
[0,1,2,3,4,5,6,7,8,9],
'''
例子
了解的基本的语法之后,来一些例子,这里例子大家可以自己敲一下
- 初始化一个全0的列表,长度为100
a = [0 for i in range(100)]
- 把一个列表中的数字全部转换为对应的字符串
a = [1,2,3,4]
b = [str(i) for i in a]
#如果列表中不仅仅只有数字,需要用if区分开
a = [1,2,3,4,'a','g',(1)]
b = [str(i) for i in a if type(i)==int]
- 创建一个三维列表
[[[k for k in range(10)] for j in range(10)] for i in range(10)]
- 读取文件到列表
file = open('test.txt','r')
a = [line for line in file]
#主要展示,推导式也可以使用其他的可迭代对象,实际迭代行到列表用处不大
- 产生100以内的素数
[p for p in range(2,100) if 0 not in [p%d for d in range(2,int(p**0.5)+1)]]
#可以把if后面的语句看做是判断p是不是素数
#即这样理解: [p for p in range(2,100) if p是否是素数 ]
if 0 not in [p%d for d in range(2,int(p**0.5)+1)]
#这里的含义是,生成2到sqrt(p)+1的数字间可以所有可以除法结果,如果有0即可以整数那么就不是,相反,只要列表中不存在0即是素数
- 把一个列表逆序
a = [1,2,3,4]
b = [a[len(a)-1-a] for i in range(len(a))]
- 列表去重
a = [1,2,3,4,2,3,4,6]
b = [i for i in a if i not in b]
#结果-->[]
#注意:此时并不能达到效果,因为在推导式里面的时候,还没有b这个变量
#使用for实现
b = []
for i in a:
if i not in b:
b.append(i)
#推导式虽然很强大,不过也不是万能的,有些功能还是需要for循环来实现的哦
练习
学了这么多,不如来做几个例题吧,欢迎大家在评论区交流哦,如果有什么问题的也可以私信我
- 用推导式把a=[1,2,3,4]变为[1,4,9,16]
- 用推导式得到100之内的偶数
- 用推导式把a=[‘a’,‘b’,‘c’,‘d’]变为[‘b’,‘c’,‘d’,‘e’]
- 用推导式实现四位列表
- 给定一个列表[4800,3800,7000,5600]来对其中大于5000的加200,否则加500 ps:可以回顾进阶一节