Python筆記002-列表推導式

Python筆記002-列表推導式

如下是我學習《流暢的Python》後的我的筆記,如今拿出來和你們共享,但願能幫到各位Python學習者。python

首次發表於: 微信公衆號:科技老丁哥,ID: TechDing,敬請關注。

本篇主要知識點:

  1. 列表推導式能夠從一個序列快速構建另外一個序列,很是方便快捷,強烈建議使用。git

  2. 列表推導式適用於簡單的for循環,能夠對一個列表中的每一個元素進行相同操做,也能夠挑選出原列表中知足必定條件的元素組成新的列表。github

  3. 集合推導式應用比較少,而字典推導式卻應用普遍,能夠從一個dict中選擇出知足必定條件的items組成新的dict,也能夠對原dict中的key或value進行操做。編程

  4. 列表推導式有極其普遍的應用場景,能夠用於循環執行某個函數,也能夠用於將某個list轉換爲dict,或將dict轉換爲list等。微信

1. 列表推導式

列表推導式是構建列表(list)的一種快捷方式,並且可讀性強,用它編寫的代碼很是有Python味兒,是一種很是推薦的編程風格。函數

並且,Python的內部實現對列表推導式作了大量優化,能夠保證運行速度很是快。學習

列表推導式能夠僅僅使用[]來生成一個list,基本代碼格式爲:[表達式 for 變量 in 列表] 或者 [表達式 for 變量 in 列表 if 條件],以下爲這兩種格式的實現方法:優化

## demo1:
alist=[1,2,3,50,89,26,30]
odd=[i for i in alist if i%2==1] # 選出列表alist中全部的奇數
print(odd) # [1, 3, 89]

Python中的列表推導式主要替換了Java或C語言中的for循環,當你想使用for循環來實現簡單的業務時,不妨使用列表推導式。code

### demo2:
alist=[1,2,3,50,89,26,30]
plus=[i*2+10 for i in alist] # 簡單算術操做
print(plus) # [12, 14, 16, 110, 188, 62, 70]

固然,若是是比較複雜的業務,須要多行代碼才能實現,那仍是老老實實用for循環來實現吧。從這一點來講,列表推導式相似於函數中的lambda表達式,簡單的函數能夠直接用lambda來表示。orm

列表推導式還能夠實現嵌套,通常爲了可讀性比較強,最多嵌套3層。

### demo3: 列表推導式的嵌套用法
alist=[1,2,5]
blist=['A','B','C']
combined=[b+'_'+str(a) for b in blist for a in alist]
print(combined) # ['A_1', 'A_2', 'A_5', 'B_1', 'B_2', 'B_5', 'C_1', 'C_2', 'C_5']

# demo4: 加入判斷條件: 只用奇數
combined2=[b+'_'+str(a) for b in blist for a in alist if a%2==1]
print(combined2) # ['A_1', 'A_5', 'B_1', 'B_5', 'C_1', 'C_5']

2. 其餘推導式

列表推導式並不只僅適用於列表(list),還適用於其餘序列類型,好比set, dict等。因此有的人將生成set的叫作集合推導式,把生成dict的叫作字典推導式。

集合推導式的用法和列表推導式同樣,只是將[]改成{}便可,但獲得的集合元素之間若是重複,則僅僅保留一個,這是由set的特性:元素不能重複決定的。

### 集合推導式:
## demo1:
alist=[1,2,3,50,89,26,30]
odd={i for i in alist if i%2==1} # 選出列表alist中全部的奇數
print(odd) # {89, 1, 3}

字典推導式的用法和列表推導式同樣,只是將[]改成{},但迭代的對象是一個字典類型。

使用字典推導式能夠實現不少多樣化操做,好比下面將key,value互換。

### 字典推導式:
# demo1: key,value互換;
dictA={'a':10,'b':20,'c':30}
changed={value:key for key,value in dictA.items()}
print(changed) # {10: 'a', 20: 'b', 30: 'c'}

還好比:單獨對keys進行迭代,能夠選出keys知足必定條件items組成新的dict

### demo2: 選出key是奇數的items
dictB={1:'10',2:'20',3:'30',4:'40'}
odd_dict={key:dictB[key] for key in dictB.keys() if key%2==1}
print(odd_dict) # {1: '10', 3: '30'}

同理,也能夠單獨對values進行迭代,選出values知足必定條件的items組成新的dict.

3. 應用示例

列表推導式還有些其餘應用場景,好比:

循環執行某個函數:

# 循環執行某個函數:
import time
def func_test(x):
    print('start test: {}'.format(x))
    time.sleep(1)
    print('end test: {}'.format(x*2)) # 僅僅乘以2
[func_test(x) for x in range(10,15,2)] # 使用列表推導式循環執行某個函數

start test: 10
end test: 20
start test: 12
end test: 24
start test: 14
end test: 28

循環執行函數,並獲取返回值:

# 循環執行某個函數:
import time
def func_test(x):
    print('start test: {}'.format(x))
    time.sleep(1)
    print('end test: {}'.format(x*2)) # 僅僅乘以2
    return x*2
result=[func_test(x) for x in range(10,15,2)] # 使用列表推導式循環執行某個函數
print(result) # [20, 24, 28]

經過列表推導式和字典推導式的靈活運用,能夠將dict類型數據和list數據相互轉化,好比:

# 由list生成字典:
blist=['A','B','C']
dict_from_list={b:str(idx+10) for idx,b in enumerate(blist)}
print(dict_from_list) # {'A': '10', 'B': '11', 'C': '12'}

# 由dict生成list
dictB={1:'10',2:'20',3:'30',4:'40'}
list_from_dict=[key for key,_ in dictB.items() if key%2==0] # 選出偶數的key
print(list_from_dict) # [2, 4]

首次發表於: 微信公衆號:科技老丁哥,ID: TechDing,敬請關注。

本文全部代碼都已經上傳到個人github,歡迎下載

參考資料:

  1. 《流暢的Python》,Luciano Ramalho (做者) 安道 , 吳珂 (譯者)。
相關文章
相關標籤/搜索