1. 程式人生 > 實用技巧 >python之列表推導式

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)

總之,列表推導式,前提必須有方括號,就是[]。