Python列表推导式
定义:
- 个人理解:list comprehension采用了表达式的方式对容器类型数据进行过滤,并且把结果组成一个新的列表
- 官方定义:列表推导式提供了一个更简单的创建列表的方法,常见的就是把某种操作应用于序列或者可迭代对象的每个元素上,然后使用其结果创建列表,或者通过满足某些特定条件元素来创建子序列
基本列表推导式
- 语法:变量= [变量或者变量的处理结果 for 变量 in 容器类型数据]
实例1:基本列表推导式
#创建一个0-9的平方列表(常规)
s = []
for i in range(10):
s.append(i**2)
print(s)
#使用列表高阶函数map
s = map(lambda x:x**2,range(10))
print(list(s))
#列表推导式,等价于常规方法操作,就是一个表达式
s = [i**2 for i in range(10)]
print(s)
#输出结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
实例2:
#字符串'1234',得到[2,4,6,8]
#常规方法
str = '1234'
list1 = []
for i in str:
list1.append(int(i)*2)
print(list1)
#列表推导式
re = [int(i)*2 for i in str]
print(re)
#使用列表推导式和位运算(左移一位)
re = [int(i)<<1 for i in str]
print(re)
#输出结果
[2, 4, 6, 8]
[2, 4, 6, 8]
[2, 4, 6, 8]
带有判断条件的列表推导式
- 变量 =[变量或者变量的处理结果 for i in 容器类型数据 条件表达式](其中for可以写多层)
实例:
#从0-9求所有的偶数,返回列表数据
#常规方法
newlist = []
for i in range(10):
if i%2 == 0 :
newlist.append(i)
print(newlist)
#判断条件的列表推导式
re = [i for i in range(10) if i%2==0]
print(re)
#输出结果
[0, 2, 4, 6, 8]
[0, 2, 4, 6, 8]
带有条件判断多条循环的推导式
实例:
#[1,2,3][3,1,4]==>把两个列表中的元素两两组合不重复
#常规方法
b = []
for i in [1,2,3]:
for m in [3,1,4]:
if i!=m:
b.append((i,m))
print(b)
#列表推导式
b1 = [(i,m) for i in [1,2,3] for m in [3,1,4] if i!=m]
print(b1)
#输出结果
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
嵌套循环列表推导式
#将一个列表交换行和列,嵌套列表推导式
s1 = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
#常规方法
list1 = []
for i in range(4):
res = []
for row in s1:
#print(row[i],end=' ')
res.append(row[i])
list1.append(res)
print(list1)
#嵌套循环列表推导式
list1 = [[row[i] for row in s1] for i in range(4)]
print(list1)
#输出结果
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
练习题
- 练习1:列表推导式完成99乘法表
#常规做法:
for x in range(1,10):
for y in range(1,x+1):
print(f'{x*y}={x}*{y}',end=' ')
y+=1
print()
x+=1
#列表推导式
list2 = [[f'{x*y}={x}*{y}' for y in range(1,1+x)]for x in range(1,10)]
print(list2)
#输出结果
1=1*1
2=2*1 4=2*2
3=3*1 6=3*2 9=3*3
4=4*1 8=4*2 12=4*3 16=4*4
5=5*1 10=5*2 15=5*3 20=5*4 25=5*5
6=6*1 12=6*2 18=6*3 24=6*4 30=6*5 36=6*6
7=7*1 14=7*2 21=7*3 28=7*4 35=7*5 42=7*6 49=7*7
8=8*1 16=8*2 24=8*3 32=8*4 40=8*5 48=8*6 56=8*7 64=8*8
9=9*1 18=9*2 27=9*3 36=9*4 45=9*5 54=9*6 63=9*7 72=9*8 81=9*9
[['1=1*1'], ['2=2*1', '4=2*2'], ['3=3*1', '6=3*2', '9=3*3'], ['4=4*1', '8=4*2', '12=4*3', '16=4*4'], ['5=5*1', '10=5*2', '15=5*3', '20=5*4', '25=5*5'], ['6=6*1', '12=6*2', '18=6*3', '24=6*4', '30=6*5', '36=6*6'], ['7=7*1', '14=7*2', '21=7*3', '28=7*4', '35=7*5', '42=7*6', '49=7*7'], ['8=8*1', '16=8*2', '24=8*3', '32=8*4', '40=8*5', '48=8*6', '56=8*7', '64=8*8'], ['9=9*1', '18=9*2', '27=9*3', '36=9*4', '45=9*5', '54=9*6', '63=9*7', '72=9*8', '81=9*9']]
- 练习2:把字典{'user':'admin','age':20,'phone':12222}转换成k=v的格式列表['user=admin','age=20','phone=12222']
#常规方法
dict1 = {'user':'admin','age':20,'phone':12222}
res = []
for i in dict1:
res.append(f'{i}={dict1[i]}')
print(res)
#列表推导式
ress = [f'{i}={dict1[i]}' for i in dict1]
print(ress)
#然后连接成一个用&号连接的字符串
str = '&'.join(ress)
print(str)
#输出结果
['user=admin', 'age=20', 'phone=12222']
['user=admin', 'age=20', 'phone=12222']
user=admin&age=20&phone=12222
- 练习3:将列表中的所有字符全部小写['AAAD',''FFFFGH],'MSWMWJ']
list1=['AAAD','FFFFGH','MSWMWJ']
#列表推导式
resualt = [i.lower() for i in list1]
print(resualt)
#输出结果
['aaad', 'ffffgh', 'mswmwj']
- 练习4:x是0-5之间的偶数,y是0-5之间的奇数,x,y组成元组,生成列表
list1 = [(x,y) for x in range(0,6,2) for y in range(1,6,2)]
print(list1)
list1 = [(x,y) for x in range(6) for y in range(6) if x%2==0 and y%2==1 ]
print(list1)
#输出结果
[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
- 练习5:倒序完成99乘法表
#常规做法:
for x in range(9,0,-1):
for y in range(1,x+1):
print(f'{x*y}={x}*{y}',end=' ')
y+=1
print()
x+=1
#列表推导式
re = [[f'{x*y}={x}*{y}' for y in range(1,x+1)] for x in range(9,0,-1) ]
print(re)
#输出结果
9=9*1 18=9*2 27=9*3 36=9*4 45=9*5 54=9*6 63=9*7 72=9*8 81=9*9
8=8*1 16=8*2 24=8*3 32=8*4 40=8*5 48=8*6 56=8*7 64=8*8
7=7*1 14=7*2 21=7*3 28=7*4 35=7*5 42=7*6 49=7*7
6=6*1 12=6*2 18=6*3 24=6*4 30=6*5 36=6*6
5=5*1 10=5*2 15=5*3 20=5*4 25=5*5
4=4*1 8=4*2 12=4*3 16=4*4
3=3*1 6=3*2 9=3*3
2=2*1 4=2*2
1=1*1
[['9=9*1', '18=9*2', '27=9*3', '36=9*4', '45=9*5', '54=9*6', '63=9*7', '72=9*8', '81=9*9'], ['8=8*1', '16=8*2', '24=8*3', '32=8*4', '40=8*5', '48=8*6', '56=8*7', '64=8*8'], ['7=7*1', '14=7*2', '21=7*3', '28=7*4', '35=7*5', '42=7*6', '49=7*7'], ['6=6*1', '12=6*2', '18=6*3', '24=6*4', '30=6*5', '36=6*6'], ['5=5*1', '10=5*2', '15=5*3', '20=5*4', '25=5*5'], ['4=4*1', '8=4*2', '12=4*3', '16=4*4'], ['3=3*1', '6=3*2', '9=3*3'], ['2=2*1', '4=2*2'], ['1=1*1']]
- 练习5:求m,n矩阵中元素的乘积,只能有两种效果:[2,4,6,12,15,18,28……]或者[[2,4,6],[12,15,18],[28……]]
#常规做法
m=[[1,2,3],[4,5,6],[7,8,9]]
n = [[2,2,2],[3,3,3],[4,4,4]]
list3 = []
for i in range(0,3):
for j in range(0,3):
print(m[i][j]*n[i][j],end=' ')
j+=1
i+=1
#列表推导式
li = [m[i][j]*n[i][j] for i in range(0,3) for j in range(0,3)]
print(li)
li = [[m[i][j]*n[i][j] for j in range(0,3)] for i in range(0,3)]
print(li)
#输出结果
2 4 6 12 15 18 28 32 36
[2, 4, 6, 12, 15, 18, 28, 32, 36]
[[2, 4, 6], [12, 15, 18], [28, 32, 36]]
司甜甜爱吃蛋糕~~~

浙公网安备 33010602011771号