Python筆記002-列表推導式

Python筆記002-列表推導式

以下是我學習《流暢的Python》後的個人筆記,現在拿出來和大家共享,希望能幫到各位Python學習者。

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

本篇主要知識點:

  1. 列表推導式可以從一個序列快速構建另一個序列,非常方便快捷,強烈建議使用。

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

  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循環來實現簡單的業務時,不妨使用列表推導式。

### 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來表示。

列表推導式還可以實現嵌套,一般爲了可讀性比較強,最多嵌套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 (作者) 安道 , 吳珂 (譯者)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章