iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Software Development

燃燒大三的成果發表系列 第 17

燃燒大三的成果發表第十七天 - 其他用法(下)

  • 分享至 

  • xImage
  •  

大家好,我今天要來介紹剩下的用法,首先是跟map長得很像,但又不太一樣的「reduce & filter」,reduce & filter跟map一樣,第一個參數都是接「函數」第二個參數是接「迭代的資料」。我們剛剛map是給定一組一組的參數,做運算式並重組成一個list,reduce比較不一樣的是他會一直把前面參數運算完的結果作為下一個輸入的參數

讓我們先來看看reduce的例子:

rom functools import reduce
a = reduce(lambda a,b: a*b, (1, 2, 3, 4, 5))
print(a) # 1*2*3*4*5 = 120

這裡我們延續map()的例子作為改寫成reduce的樣子,其實就是變成1*2=2 -> 2*3=6 -> 6*4=24 -> 24*5=120,這邊使用上其實跟map都很像只是輸入的參數上不太一樣,範例中第一個參數我也都會使用lambda匿名函數做示範,如果不加其實也可以,只是要另外在宣告一個函數頗麻煩,所以我這邊都使用lambda。

接下來我們看看filter的用法,

a = list(filter(lambda a: a%2==1, (1, 2, 3, 4, 5)))
print(a)

這邊我透過一個fucntion篩選出符合a%2==1的資料,很明顯fliter名符其實就是拿來過濾資料的用途。

然後我要來介紹「sorted & enumerate」,首先來介紹sorted,功用也很名符其實要排序,我們來看看簡單的範例:

a = [5, 7, 8, 6, 7, 4, 1, 4]
a = sorted(a)
print(a)
# [1, 4, 4, 5, 6, 7, 7, 8]

今天如果我們的資料是有帶數字的想排序,可能是這個人的收入、年齡......等等,我們就可以更簡單地進行排序:

a = {1: "黃大煒", 4: "陳小明", 2: "小熊維尼", 3: "唐老鴨"}
a = sorted(a.items(), key=lambda x:x[0])
print(a)
# [(1, '黃大煒'), (2, '小熊維尼'), (3, '唐老鴨'), (4, '陳小明')]

或是我們可以指定某一個索引的欄位作為要排序資料的欄位

a = {1: ("黃大煒", 20), 4: ("陳小明", 18), 2: ("小熊維尼", 30), 3: ("唐老鴨", 22)}
a = sorted(a.items(), key=lambda x:x[1][1])
print(a)
# [(4, ('陳小明', 18)), (1, ('黃大煒', 20)), (3, ('唐老鴨', 22)), (2, ('小熊維尼', 30))]

看完排序可能對enumerate還沒有什麼感覺,因為我還沒開始介紹,我們直接來看看範例就有感覺了:

a = [("黃大煒", 20), ("陳小明", 18), ("小熊維尼", 30), ("唐老鴨", 22)]
a = dict(enumerate(sorted(a, key=lambda x:x[1])))
print(a)
# {0: ('陳小明', 18), 1: ('黃大煒', 20), 2: ('唐老鴨', 22), 3: ('小熊維尼', 30)}

透過enumerate我們能夠直接給一個順序的索引,阿如果我是想要單純排個名次,我不要想要從0開始,enumerate後面還可以加一個start的參數,指定開始的索引,我會改成這樣:

a = [("黃大煒", 20), ("陳小明", 18), ("小熊維尼", 30), ("唐老鴨", 22)]
a = dict(enumerate(sorted(a, key=lambda x:x[1]), start=1))
print(a)
# {1: ('陳小明', 18), 2: ('黃大煒', 20), 3: ('唐老鴨', 22), 4: ('小熊維尼', 30)}

python到這裡算是告一段落了,明天開始我要介紹另一個後端框架Flask並結合其他工具。


上一篇
燃燒大三的成果發表第十六天 - map
下一篇
燃燒大三的成果發表第十八天 - Flask
系列文
燃燒大三的成果發表30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言