python之列表推导式

列表推到式提供了从序列创建列表的简单途径。通常应用程序将一些操作应用于某个序列的每个元素,用以获得其结果生成新的元素,或者根据判定的条件创建子序列。

每个列表推到式都在for后面跟一个表达式,然后有0个到多个for或者if字句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

1,将列表中的每个元素乘以某个数,获得一个新的序列:

 1 #将列表元素乘以某个数,得到新列表
 2 a = [2,4,6] #定义列表
 3 b = [3*x for x in a] #通过for循环把列表lista中的每个元素循环出来,然后再乘以3
 4 print(b) #得到新列表 等同于print(list(b)) [6, 12, 18]
 5 print(tuple(b)) #得到新元组 (6, 12, 18)
 6 print(dict(b)) #发生错误 TypeError: cannot convert dictionary update sequence element #0 to a sequence
 7 print(set(b)) #得到新集合 {18, 12, 6}
 8 
 9 c = [[x,x*2] for x in a] #通过for循环读取a中的每个元素赋值给x,通过[x,x*2]得到新序列
10 print(c) #得到嵌套列表c 等同于print(list(c)) [[2, 4], [4, 8], [6, 12]]
11 print(tuple(c)) #得到元组嵌套列表 ([2, 4], [4, 8], [6, 12])
12 print(dict(c)) #得到字典 {2: 4, 4: 8, 6: 12}
13 print(set(c)) #发生错误 TypeError: unhashable type: 'list'

2,对序列中的每个元素逐个调用某个方法:

 1 #对序列中的每个元素都调用某方法
 2 fruit = ['   banana',' loganberry ','passion fruit '] #定义列表,并且设置空格
 3 afterfruit = [weapon.strip() for weapon in fruit] #使用for循环循环读取列表每个元素,调用方法strpi()去除前后空格,并赋值给afterfruit
 4 print(afterfruit) #打印 ['banana', 'loganberry', 'passion fruit']
 5 
 6 upperFruit = [afterupper.upper() for afterupper in afterfruit] #循环读取afterfruit里的每个元素并调用方法upper()切换为答谢
 7 print(upperFruit) #打印 ['BANANA', 'LOGANBERRY', 'PASSION FRUIT']
 8 #以下再切回小写
 9 lowerFruit = [lower.lower() for lower in upperFruit] 
10 print(lowerFruit)

3,列表推到式用if子句过滤:

1 #用if子句过滤条件
2 a = [2,4,6] #定义列表
3 b = [3 * x for x in a if x > 2] #循环读取列表a中的每个元素并赋值给临时变量x,如果满足x>2就执行x*3得到新序列
4 print(b) #打印 [12, 18]
5 
6 c = [3 * x for x in a if x < 2]
7 print(c) #[]

4,列表推到式使用复杂表达式和嵌套函数:

 1 #列表推到式使用复杂表达式和嵌套函数
 2 '''
 3 使用round()函数返回浮点数floatx的四舍五入值,其中参数i表示表刘小数点后的几位
 4 使用for循环读取列表range(1,6)并把读取到的值赋值给i
 5 str()将浮点数转换成字符串
 6 '''
 7 floatx = 10/3 #定义浮点数
 8 a = [str(round(floatx, i)) for i in range(1,6)] #定义a
 9 print(floatx) #打印floatx 3.3333333333333335
10 print(type(floatx)) #打印floatx的数据类型 <class 'float'>
11 print(a) #打印a ['3.3', '3.33', '3.333', '3.3333', '3.33333']
12 print(type(a)) #打印a的数据类型 <class 'list'>
13 print(a[1]) #打印索引为1的值 3.33
14 print(type(a[1])) #打印索引为1的值的数据类型 <class 'str'>

5,循环的其他技巧演示:

 1 #循环和其他技巧
 2 v1 = [2,4,6] #定义列表v1
 3 v2 = [4,3,-10] #定义列表v2
 4 
 5 xc = [x * y for x in v1 for y in v2] #定义列表xc,结果是列表元素相乘的乘积
 6 print(xc) #打印 [8, 6, -20, 16, 12, -40, 24, 18, -60]
 7 
 8 xj = [x + y for x in v1 for y in v2] #定义列表相加,结果是列表元素相加的和
 9 print(xj) #打印 [6, 5, -8, 8, 7, -6, 10, 9, -4]
10 
11 aList = [v1[i] * v2[i] for i in range(len(v1))] #定义aList,结果是给定条件元素相加的和
12 print(aList) # [8, 12, -60]
13 print(len(v1)) #长度为3
14 print(range(len(v1))) #range(0,3),取值为0,1,2
15 print(len(aList)) #长度为3
16 
17 bList = [v1[i] * v2[j] for i in range(len(v1)) for j in range(len(v2))]
18 '''bList表达式的取值为:[
19         v1[0] * v2[0], v1[0] * v2[1], v1[0] * v2[2]
20         v1[1] * v2[0], v1[1] * v2[1], v1[1] * v2[2]
21         v1[2] * v2[0], v1[2] * v2[1], v1[2] * v2[2]
22         ]
23 共9个值
24 '''
25 #相关数值打印看是否符合预期
26 print(len(bList))
27 print(len(v1))
28 print(len(v2))
29 print(range(len(v1)),range(len(v2)))
30 print(len(bList))

6,嵌套列表解析:

 1 martix34 = [
 2     [1,2,3,4],
 3     [5,6,7,8],
 4     [9,10,11,12],
 5 ]
 6 martix43 = [[row[i] for row in martix34] for i in range(4)]
 7 print(martix43)
 8 '''
 9 解析:
10 for row in martix34:
11     print(row)
12 循环读取了矩阵的三行
13 然后每一行都是可迭代对象,就有索引和值
14 row[i]就是根据i的值去取每行的值
15 for i in range(4):
16     print(i)
17 i的取值范围为0,1,2,3
18 整个表达式martix43就可以理解为:
19                             [
20     [row[0][0]],row[1][0],row[2][0]...
21                             ]
22 '''
23 
24 #也可以这样实现:
25 transposed = []
26 for i in range(4):
27     transposed.append([row[i] for row in martix34])
28 print(transposed)
29 
30 #还有一种方法:
31 transposed = []
32 for i in range(4):
33     transposed_row = []
34     for row in martix34:
35         transposed_row.append(row[i])
36     transposed.append(transposed_row)

总之,列表推导式,前提必须有方括号,就是[]。

 

posted @ 2020-07-03 15:42  、一叶孤城  阅读(378)  评论(0编辑  收藏  举报