列表推導式是Python基礎,好用,而又非常重要的功能,也是最受歡迎的Python特性之一,可以說掌握它是成為合格Python程式員的基本標準。本質上可以把列表推導式理解成一種集合了變換和篩選功能的函數,通過這個函數把一個列錶轉換成另一個列表。注意是另一個新列表,原列表保持不變。 看樣本:
(1)對列表中的每項元素進行立方運算(變換功能)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0]
print(b)
[8, 64, 216, 512, 1000]
從結果上可以看出有篩選條件的話是先篩選再變換,即先篩掉不滿足條件的元素,再進行變換運算。可以同時加多個篩選條件,如對大於5的且是偶數的元素進行立方運算,樣本如下:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [x ** 3 for x in a if x % 2 == 0 if x > 5]
print(b)
[216, 512, 1000]
(3)與zip結合 將a,b兩個列表中相對應得值組合起來,形成一個新列表。例如包含x座標的列表與y座標的列表形成相對應的點座標[x, y]列表。
a = [-1, -2, -3, -4, -5, -6, -7, -8, -9, -10]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
xy = [[x, y] for x, y in zip(a, b)]
print(xy)
[[-1, 1], [-2, 2], [-3, 3], [-4, 4], [-5, 5], [-6, 6], [-7, 7], [-8, 8], [-9, 9], [-10, 10]]
(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]
Python中還有字典推導式、集合推導式等,與列表推導式使用方式大致相同。 列表推導式的使用非常廣泛,從實際使用經驗來看,列表推導式使用的頻率是非常高的,也是相當好用的。而對於列表推導式的多層for迴圈,尤其是3層以上的或帶複雜篩選條件的,犧牲了較多的可讀性,直接用多個普通for迴圈方式實現就可以了,畢竟方便的實現功能是第一位的,多幾行代碼就多幾行吧。