iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 9
1

List Comprehesion

在python的list表示中,提供了一種簡易的寫法可以將複雜的迴圈表示為一行的形式,如官網文件中寫道,我們想要生成一個0-9平方項的列表可以這樣寫:

土法煉鋼使用迴圈

squares = []
for x in range(10):
    squares.append(x**2)

# Output
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

或者可以表示為list建構子帶函式參數

squares = list(map(lambda x: x**2, range(10)))

或者是表示為List Comprehesion形式:

squares = [x**2 for x in range(10)]

List Comprehesion的語法

[expression for item in iterable]其中:

  • expression為表達式
  • iterable為可迭代的物件
  • item為迭代中的變數

上述程式碼可以看到,使用List Comprehesion寫法可以使程式碼更簡潔和易讀

條件式

在list comprehesion表示中甚至可以加入條件式,語法為:
[expression for item in iterable if condition]其中:

  • expression為表達式
  • iterable為可迭代的物件
  • item為迭代中的變數
  • condition為條件式

接續上述範例,若想要產生一組0-9中奇數的平方項列表,可以這樣寫:

odd_squares = [x**2 for x in range(10) if x%2 != 0]

# Output
odd_squares
[1, 9, 25, 49, 81]

巢狀迴圈

在list comprehesion表示中也可以將巢狀迴圈表示為一行,語法為:
[expression for item in iterable for item2 iterable2 ...]其中:

  • expression為表達式
  • iterable為可迭代的物件
  • item為迭代中的變數

巢狀迴圈的順序等於list comprehesion裡由左至右的順序,例如我們想要生成一個九九乘法表可以表示為:

table = [x*y for x in range(10)[1:] for y in range(10)[1:]]

# Output
table
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

或是想要整理成這樣,因為list comprehesion本身就可以表示為一個合法的表達式(expression):

table = [[x*y for x in range(10)[1:]] for y in range(10)[1:]]

# Output
table
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 4, 6, 8, 10, 12, 14, 16, 18], [3, 6, 9, 12, 15, 18, 21, 24, 27], [4, 8, 12, 16, 20, 24, 28, 32, 36], [5, 10, 15, 20, 25, 30, 35, 40, 45], [6, 12, 18, 24, 30, 36, 42, 48, 54], [7, 14, 21, 28, 35, 42, 49, 56, 63], [8, 16, 24, 32, 40, 48, 56, 64, 72], [9, 18, 27, 36, 45, 54, 63, 72, 81]]

其他

在list comprehesion中甚至還有更複雜的寫法:
[expression if-else clause for item in iterable condition/iterable]其中:

  • expression為表達式
  • if-else clause為if-else子句
  • iterable為可迭代的物件
  • item為迭代中的變數
  • condition為條件式

基於可讀性的因素,這樣複雜的表示可能會造成程式的可讀性變差,有興趣的觀眾朋友再自己試試囉

Reference

官網文件List Comprehesion
https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
Python Basics:List Comprehesions
https://towardsdatascience.com/python-basics-list-comprehensions-631278f22c40


上一篇
Python - Data structure、list列表
下一篇
Python - 淺複製(shallow copy)與深複製(deep copy)
系列文
30天學會Python30

尚未有邦友留言

立即登入留言