Python 速查手冊

3.11 串列的綜合運算

串列的綜合運算 (list comprehension) 是指在串列 (list) 的字面常數 (literal) ,也就是中括弧裡寫運算式 (expression) 及迴圈 (loop) 、條件 (condition) 等陳述 (statement) ,就可以直接在中括弧裡面產生串列元素,這是種簡潔的語法,目的是大幅縮短程式碼 (code) 的行數。

先來看看一個簡單的例子,這邊變數 (variable) a 會得到整數三次方的串列,中括弧裡頭先是串列中所有元素的運算式,注意運算式的變數 x 跟後頭 for-in 迴圈用的控制變數名稱一樣,因此 for-in 迴圈取得的每個元素都會做相同的運算,此例為計算三次方,也就是說,開頭運算式的結果會變成 a 的元素,注意開頭的運算式之後只跟 for 有一個空格, for 的最後也不需要冒號

a = [x ** 3 for x in range(10)]
print(a)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:list05.py
# 功能:示範串列的綜合運算
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 list05.py
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
$

如果想要產生跟變數 a 一樣的串列,把 for 迴圈展開來寫至少要三行程式碼,例如下面變數 b 利用 for-in 迴圈產生完全一樣的串列

b = []
for x in range(10):
    b.append(x ** 3)
print(b)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:list06.py
# 功能:示範串列的綜合運算
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 list06.py
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
$

串列的綜合運算也可以用兩個變數,例如需要一個座標 5 乘以 5 的地圖,這個串列綜合運算就把所有座標點一次產生

c = [(x, y) for x in range(5) for y in range(5)]
print(c)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:list07.py
# 功能:示範串列的綜合運算
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 list07.py
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]
$

假設地圖上 (0, 0)(4, 4) 的對角線要放特別的東西,產生座標的綜合運算之後加上 if 條件,就可以取得條件設定下的座標點

d = [(x, y) for x in range(5) for y in range(5) if x == y]
print(d)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:list08.py
# 功能:示範串列的綜合運算
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 list08.py
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
$

串列的綜合運算可以處理任何出現在串列中的資料型態 (data type) ,例如字串 (string) 串列 strstr 是儲存英文單字的字串,如果要把英文單字的首字母都改成大寫,這時候就利用字串的 title() 方法及串列的綜合運算,就可以得到新的大寫字母開頭的字串串列了

str = ["title", "word", "you"]
e = [x.title() for x in str]
print(e)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:list09.py
# 功能:示範串列的綜合運算
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 list09.py
['Title', 'Word', 'You']
$

上一頁: 3.10 yield 運算
Python 速查手冊 - 目錄
下一頁:單元 4 - 陳述
回 Python 教材首頁