串列的綜合運算 (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) 串列 str , str 是儲存英文單字的字串,如果要把英文單字的首字母都改成大寫,這時候就利用字串的 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'] |
$ |
相關教學影片