1.前言app
推導式,英文名字叫comprehensions,注意與comprehension(理解)只有s字母之差。推導式又能夠叫解析式,推導式能夠從一種數據序列構建新的數據序列的結構體。推導式分爲,列表推導式,字典推導式,嵌套列表推導式,本節介紹列表推導式,其餘後續介紹.spa
2.列表推導式概念code
它的結構是在一箇中括號裏包含一個表達式,而後是一個for
語句,而後是0個或多個for
或者if
語句。那個表達式能夠是任意的,意思是你能夠在列表中放入任意類型的對象。返回結果將是一個新的列表,是另外一個新列表,原列表保持不變。在這個以if
和for
語句爲上下文的表達式運行完成以後產生。對象
寫法模式:[expr for value in collection if condition]ip
if過濾條件,取決於實際應用是否須要,無關緊要it
3.實例:io
#輸出30之內被4整除的數,各自加0.5
list1=[i+0.5for i in range(30)if i%4==0]
print(list1)
# [0.5, 4.5, 8.5, 12.5, 16.5, 20.5, 24.5, 28.5]
對比for循環代碼爲:
list2=[]
for i in range(30):
if i%4==0:
list2.append(i+0.5)
print(list2)
# [0.5, 4.5, 8.5, 12.5, 16.5, 20.5, 24.5, 28.5]
# 將列表中長度大於4的字母大寫,長度小於或等於4的字母小寫
name1= ['Bob','tom','alice','Jerry','Wendy','Smith','liuhu']
name2=[name.upper() for name in name1 if len(name)>4]
print(name2)
name3=[name.lower() for name in name1 if len(name)<=4]
print(name3)
name4=name2.extend(name3)
print(name4)
print(name2)
# ['ALICE', 'JERRY', 'WENDY', 'SMITH', 'LIUHU']
# ['bob', 'tom']
# None
# ['ALICE', 'JERRY', 'WENDY', 'SMITH', 'LIUHU', 'bob', 'tom']
注意:name4爲空,寫法須要更正
還有更簡單的方法,在列表推導式中使用if else語句:
name5= ['Bob','tom','alice','Jerry','Wendy','Smith','liuhu']
name6=[name.upper()if len(name)>4 else name.lower() for name in name5]
print(name6)
# ['bob', 'tom', 'ALICE', 'JERRY', 'WENDY', 'SMITH', 'LIUHU']
示例3:
# 與zip結合
a = [ -6, -7, -8, -9, -10]
b = [1, 2, 3, 4, 5]
xy = [[x, y] for x, y in zip(a, b)]
print(xy)
# [[-6, 1], [-7, 2], [-8, 3], [-9, 4], [-10, 5]]
示例4:
# 支持多層for循環,將一個嵌套列表轉換成一個一維列表。
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [j for i in a for j in i]
print(b)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
示例5:
m,n中矩陣元素的乘積玩法;
m = [[1,2,3],[4,5,6],[7,8,9]]n = [[2,2,2],[3,3,3],[4,4,4]]# 矩陣行與行相乘hc=[m[row][col]*n[row][col] for row in range(3) for col in range(3)]print(hc)# [2, 4, 6, 12, 15, 18, 28, 32, 36]# 矩陣相乘jc=[[m[row][col]*n[row][col] for col in range(3)] for row in range(3)]print(jc)# [[2, 4, 6], [12, 15, 18], [28, 32, 36]]# 矩陣列與列乘lc=[[m[row][col]*n[row][col] for row in range(3)] for col in range(3)]print(lc)# [[2, 12, 28], [4, 15, 32], [6, 18, 36]]