Python筆記002-列表推導式
以下是我學習《流暢的Python》后的個人筆記,現在拿出來和大家共享,希望能幫到各位Python學習者。
首次發表于: 微信公眾號:科技老丁哥,ID: TechDing,敬請關注。
本篇主要知識點:
-
列表推導式可以從一個序列快速構建另一個序列,非常方便快捷,強烈建議使用。
-
列表推導式適用于簡單的for循環,可以對一個列表中的每個元素進行相同操作,也可以挑選出原列表中滿足一定條件的元素組成新的列表。
-
集合推導式應用比較少,而字典推導式卻應用廣泛,可以從一個dict中選擇出滿足一定條件的items組成新的dict,也可以對原dict中的key或value進行操作。
-
列表推導式有極其廣泛的應用場景,可以用于循環執行某個函數,也可以用于將某個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,歡迎下載
參考資料:
- 《流暢的Python》,Luciano Ramalho (作者) 安道 , 吳珂 (譯者)。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
