python之列表推導式
阿新 • • 發佈:2020-07-03
列表推到式提供了從序列建立列表的簡單途徑。通常應用程式將一些操作應用於某個序列的每個元素,用以獲得其結果生成新的元素,或者根據判定的條件建立子序列。
每個列表推到式都在for後面跟一個表示式,然後有0個到多個for或者if字句。返回結果是一個根據表達從其後的 for 和 if 上下文環境中生成出來的列表。如果希望表示式推匯出一個元組,就必須使用括號。
1,將列表中的每個元素乘以某個數,獲得一個新的序列:
1 #將列表元素乘以某個數,得到新列表 2 a = [2,4,6] #定義列表 3 b = [3*x for x in a] #通過for迴圈把列表lista中的每個元素迴圈出來,然後再乘以34 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)
總之,列表推導式,前提必須有方括號,就是[]。