一、介紹
Python
中有個語法糖(syntactic sugar),就是 list comprehension
,即“列表推導式”。
同樣適用於 dict
、set
等一系列可迭代的數據結構。
- 使用語法
out_list = [x for x in list if express_condition]
其中的 if
條件判斷語句可有可無。
二、range函數
Python
中 range
函數可以用來創建一個整數列表,一般用在 for
循環中。
- 使用語法
range(start, stop, [, step])
start -- 開始
stop -- 結束(不包含)
setp -- 步長
列表推導式是通過一個可迭代對象來生成列表,range
是列表推導式中最常用的可迭代對象,是精髓之一。
三、實操
1.列表推導式
- 列表推導式會遍歷可迭代對象,然后按照 for 前的表達式進行運算,生成最終的列表
- 如果有 if 條件語句, for 遍歷后緊跟着進行條件判斷
- 如果有多個 for 循環,則最終的數據數量為多個 for 循環的笛卡爾積
- 可以進行嵌套的列表推導,與嵌套 for 循環的原理相同
[x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[x**2 for x in range(10) if x > 5]
# [36, 49, 64, 81]
[x for x in range(10) if x % 2 == 0]
# [0, 2, 4, 6, 8]
[(x, x**2) for x in range(5)]
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
dict([(x, x**2) for x in range(5)])
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
[(x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8]
# [(5, 9), (7, 9), (9, 9)]
a = [2,4,6]
b = [4,3,-9]
[a[i] + b[i] for i in range(len(a))]
# [6, 7, -3]
[x * y for x in [1,2,3] for y in [1,2,3]]
# [1, 2, 3, 2, 4, 6, 3, 6, 9]
li = [1,2,3,4]
def mul2(x):
return x*2
[mul2(i) for i in li]
# [2, 4, 6, 8]
# 嵌套循環 展平矩陣
matrix = [[1,2,3], [4,5,6], [7,8,9]]
[i for row in matrix for i in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
2.字典(dict)和集合(set)推導式
- 將字典key和value互換
dic = {'a':10, 'b':20, 'c':30}
{value: key for key, value in dic.items()} # 返回鍵值對
# {10: 'a', 20: 'b', 30: 'c'}
- 提取首字母
words_list = ['apple', 'oppo', 'vivo', 'xiaomi']
set(w[0] for w in words_list)
# {'a', 'o', 'v', 'x'}
集合是無序且不重復的,會自動去掉重復的元素。
三、總結
總的來說,就是把普通的多行 for
循環壓縮成一行代碼。
這種壓縮語法適用於列表、字典、集合等可迭代數據結構。
- 代碼可讀性 只需要一行代碼
- 局部作用域 不存在變量泄露問題
- 盡量保持簡潔
參考鏈接:Python的列表推導式
參考鏈接:Python中的列表推導式
參考鏈接:Python列表推導式