4.3. 串列及元組生成式
除了先前介紹過的方式來建立串列之外,也可以用生成式來建立串列,這樣的建立方式也使得整體語法更具有Python的風格。
串列生成式
串列生成式的語法如下:
[運算式 for 項目 in 可迭代項目]
>>> l = [i for i in range(10)]
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> r = range(1, 6)
>>> type(r)
<class 'range'>
>>> l = [i for i in r]
>>> l
[1, 2, 3, 4, 5]
>>> l = [(i + 1) for i in r]
>>> l
[2, 3, 4, 5, 6]
>>> l = [(i - 1) for i in r]
>>> l
[0, 1, 2, 3, 4]
串列生成式中也可以包含 if 結構:
[運算式 for 項目 in 可迭代項目 if 條件式]
>>> r = range(1, 11)
>>> l = [i for i in r if ((i % 2) == 0)]
>>> l
[2, 4, 6, 8, 10]
>>> l = [i for i in r if ((i % 2) != 0)]
>>> l
[1, 3, 5, 7, 9]
此外,串列生成式中也可以包含 if-else 結構:
[運算式1 if 條件式 else 運算式2 for 項目 in 可迭代項目]
>>> r = range(1, 11)
>>> l = [i if (i % 2) == 0 else '' for i in r]
>>> l
['', 2, '', 4, '', 6, '', 8, '', 10]
元組的生成方式
雖然元組沒有像串列一樣生成式的語法,但是有類似的方式可以生成元組,如下:
tuple(運算式 for 項目 in 可迭代項目)
>>> t = tuple(i for i in range(10))
>>> t
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> r = range(1, 6)
>>> type(r)
<class 'range'>
>>> t = tuple(i for i in r)
>>> t
(1, 2, 3, 4, 5)
在元組的生成方式中同樣也可以包含 if 結構:
tuple(運算式 for 項目 in 可迭代項目 if 條件式)
>>> r = range(1, 11)
>>> t = tuple(i for i in r if (i > 5))
>>> t
(6, 7, 8, 9, 10)
>>> t = tuple(i for i in r if (i <= 5))
>>> t
(1, 2, 3, 4, 5)
另外,元組生成式中同樣也可以包含 if-else 結構:
tuple(運算式1 if 條件式 else 運算式2 for 項目 in 可迭代項目)
>>> r = range(1, 11)
>>> t = tuple(i if (i > 5) else '' for i in r)
>>> t
('', '', '', '', '', 6, 7, 8, 9, 10)
串列與元組的轉換方式
此外,使用 list() 及 tuple() 可以讓串列及元組進行轉換,例如:將一個元組透過 list() 轉換成串列,再利用 tuple() 轉換回元組。
>>> t = (1, 2, 3, 4, 5)
>>> t
(1, 2, 3, 4, 5)
>>> type(t)
<class 'tuple'>
>>> t = list(t)
>>> t
[1, 2, 3, 4, 5]
>>> type(t)
<class 'list'>
>>> t = tuple(t)
>>> t
(1, 2, 3, 4, 5)
參考資料
- Python編程入門第3版(簡), 第七章, Toby Donaldson著, 人民郵電出版社
- 精通Python, 第四章, Bill Lubanovic著, 賴屹民譯, 歐萊禮