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)
总之,列表推导式,前提必须有方括号,就是[]。