創作內容

1 GP

Python List Comprehension

作者:星が降る│2020-07-20 17:13:26│巴幣:2│人氣:262
寫python的時候一直用到這個語法糖,但是看很多人好像不常用就隨手寫一篇文章了

接觸過python的應該都看過類似這行的code

[i*2 for i in range(6)]

剛接觸python的人可能會看不懂這行在幹麻,其實這是一種生成list的方式

圖片引用自wiki

上圖可能就常常看到了,其實這行code跟這個數學式的涵義差不多

可以把它想像成一個函數
後面是輸入的部分,並且可以對輸入做篩選
前面是輸出的部分,也就是我們所取得的list,可以對變量做操作(可以看做函數轉換)
再用一次前面的code

[i*2 for i in range(6)]

range(6)是輸入的list,而i代表range(6)中的元素,i*2則是對每個range(6)中的元素進行變換並輸出,所以得到的list就會是下面這行

[0, 2, 4, 6, 8, 10]

上面的範例沒有加入篩選,如果加入篩選

>>> [i*2 for i in range(6) if i%2 == 0]
[0, 4, 8]

上面的code中後面的if的作用是篩選輸入的元素,if i%2 == 0表示只有偶數才會通過篩選,因此輸入會變成[0, 2, 4],輸出變成[0, 4, 8]

函數變換的部分也可以加入if else,注意這邊的if跟加在後面的if不同,這邊的是輸出轉換,所以一定要有else,也就是每個輸入的元素都要有對應的轉換

>>> [i if i%2 == 0 else i*3 for i in range(6)]
[0, 3, 2, 9, 4, 15]

>>> ["even" if i%2 == 0 else "odd" for i in range(6)]
['even', 'odd', 'even', 'odd', 'even', 'odd']

注意到下面那一個用法,輸出的轉換並不需要包含i,下面那行代表把奇數轉換成odd,偶數轉換成even

多變數及巢狀迴圈也是可行的

>>> [(x, y) for x in range(4) for y in range(3)]       
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)]

一般迴圈表示法

>>> tmp = list()           
>>> for x in range(4):     
...     for y in range(3):
...             tmp.append((x, y))
...
>>> tmp
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)]

注意愈外層的要寫在愈前面

輸出的部分也可以為dictionary等資料結構

>>> [{'number': i, 'even': 1 if i%2 == 0 else 0} for i in range(6)]  
[{'number': 0, 'even': 1}, {'number': 1, 'even': 0}, {'number': 2, 'even': 1}, {'number': 3, 'even': 0}, {'number': 4, 'even': 1}, {'number': 5, 'even': 0}]

依照這些規則可以變化出許多進階用法,可以節省程式的行數,不用寫一堆for
例如有一個list長這樣

['01-98', '02-65', '03-86']

每個字串前面是學號,後面是分數

>>> data = ['01-98', '02-65', '03-86']
>>> [(i.split('-')[0], i.split('-')[1]) for i in data]
[('01', '98'), ('02', '65'), ('03', '86')]

上面的code只需一行就可以把學號跟分數分開

很多更複雜的應用都可以用list comprehension解決

注意寫的時候不要炫技把很多行全部塞在一起造成list comprehension太長,不然看你的code的人可能會想殺了你
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4855347
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 2 篇留言

小太郎
是串列生成式的應用
拿來大量產出一些東西鰻好用的
list = [np.random.random(10) for i in range(10)]
可以直接生成一個10x10的矩陣
其中aij屬於(0,1]

想問一下是怎麼嵌入程式碼區塊的?
是使用github gist嗎?

08-17 10:42

星が降る
https://forum.gamer.com.tw/C.php?bsn=60292&snA=4879
我是用這篇文章裡面的線上工具嵌入的08-17 10:58
小太郎
感謝分享,已成功使用~

08-17 20:15

我要留言提醒:您尚未登入,請先登入再留言

1喜歡★ksstp93200 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:給有緣人看的自我介紹...

追蹤私訊切換新版閱覽

作品資料夾

airsky00大家
與一個罪犯談判的方式,就他媽誰理他!看更多我要大聲說22小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】