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]]
posted @ 2021-04-16 12:49  ST_T  阅读(1185)  评论(0)    收藏  举报