python3 第二十五章,python3
推導式(又稱解析式),是Python的一種專屬特性。推導式是可以從一個資料序列構建另一個新的資料序列的結構體。 共有三種推導,在Python2和3中都有支援:
- 列表(list)推導式
- 字典(dict)推導式
- 集合(set)推導式
1、列表推導式
列表推導式提供一個產生列表的簡潔方法。常見的應用是建立新列表,其中每個元素是應用於另一序列或可迭代的每個成員的一些操作的結果,或者建立那些滿足特定條件的元素的子序列。
其基本格式如下:
variable = [out_exp_res for out_exp in input_list if out_exp == 2]
out_exp_res:列表產生元素運算式,可以是有傳回值的函數。
for out_exp in input_list:迭代input_list將out_exp傳入out_exp_res運算式中。
if out_exp == 2:根據條件過濾哪些值可以。過濾條件可有可無,取決於實際應用
例如,假設我們要建立一個平方數列表,如:
squares = []for x in range(10): squares.append(x**2)print(squares)
以上代碼,輸出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意,上面這個建立(或者覆蓋)了一個名為x的變數,它在迴圈結束時仍然存在。我們可以計算沒有任何副作用的平方數列表:
squares = list(map(lambda x: x**2, range(10)))
或者,等價地:
squares = [x**2 for x in range(10)]
上面這個方法更加簡明且易讀。
列表推導式由一對方括弧組成,方括弧包含一個運算式,其後跟隨一個for子句,然後是零個或多個for或if子句。結果將是一個新的列表,其值來自將運算式在其後的for和if子句的上下文中求值得到的結果。例如,如果這兩個列表的元素不相等,則此listcomp組合兩個列表的元素:
squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]print(squares)
它等效於:
squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]for x in [1, 2, 3]: for y in [3, 1, 4]: if x != y: squares.append((x, y))print(squares)
注意這兩個程式碼片段中,for和if語句的順序是如何保持一致的。以上代碼,輸出:
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4), (1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
將推導式的[]改成()即可得到產生器:
squares = (x**2 for x in range(10))print(type(squares))
以上代碼,輸出:
<class 'generator'>
列表推導式的第一個運算式可以是任何錶達式,包括另外一個列表推導式,我們叫這種情況為嵌套的列表推導式。執行個體:
# 3×4矩陣的樣本,其被實現為長度為4的3個列表的列表matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],]# 下面的列表推導式將轉置行和列res = [[row[i] for row in matrix] for i in range(4)]print(res)
以上代碼,輸出:
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
嵌套的列表推導式在它後面的for上下文中求值,所以這個例子等效於:
# 3×4矩陣的樣本,其被實現為長度為4的3個列表的列表matrix = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12],]# 下面的列表推導式將轉置行和列transposed = []for i in range(4): transposed.append([row[i] for row in matrix]) print(transposed)
思考:求(x,y)其中x是0-5之間的偶數,y是0-5之間的奇數組成的元組列表,下面給出代碼但請儘可能先自己寫出來:
res = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]print(res)View Code
2、字典推導式
字典和集合推導式是該思想的延續,文法差不多,只不過產生的是集合和字典而已。其基本格式如下:
{ key_expr: value_expr for value in collection if condition }
執行個體,快速更換key和value:
data = {'a': 10, 'b': 34, 'c':100}res = {v: k for k, v in data.items()}print(res)
以上代碼,輸出:
{10: 'a', 34: 'b', 100: 'c'}
3、集合推導式
集合推導式跟列表推導式非常相似,唯一區別在於用{}代替[]。其基本格式如下:
{ expr for value in collection if condition }
執行個體:
squared = {x**2 for x in [1, 1, 2]}print(squared)
以上代碼,輸出:
{1, 4}