2017-05-18

Python List Comprehensions - 終於找到 Map 與 Filter

在 Javascript 學過這三個好用的概念:Map、Filter 與 Reduce,終於在 Python 也找到部份對應的功能。

Map 將一個 list 轉換成另一個 list,item 數不變,但每個 item 變了,就像一對一的轉換。

Filter 將一個 list 過濾成另一個 list,重點是 item 數變少了,一般狀況下 item 不會改變,可以改變是加分。

Reduce 掃過整個 list,得出單一個結果,例如累加。

這功能在 Python 叫做 List Comprehensions。

List Comprehensions

t = ['Apple', 'BANANA', 'guava']
print(t) # ['Apple', 'BANANA', 'guava']

# map,一對一轉換
print([ s.upper() for s in t ]) # ['APPLE', 'BANANA', 'GUAVA']

# filter,不只可以過濾,還可以轉換
print([ s.upper() for s in t if s.isupper()]) # ['BANANA']

# reduce,還是沒找到

語法

[ 加工 a 與 b for a in t1 if 符合這個條件 for b in t2 if 符合那個條件...]
List Comprehensions 有一個特色是變數在定義前呼叫使用。
  • 中括號,就是一個 list 物件
  • 處理變數,表示要回傳什麼
  • for 變數 in 某個 sequence 或 iterable,可以有 N 個 for,就會有 N 個變數
  • if 符合某個條件,可以有 N 個 if
效能比 for 好,但較難除錯。

範例

可以回傳複雜的物件。
print([ (x, x**2) for x in range(5) ]) 
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16)]
可以使用多個變數(for)。
print([ (x, y) for x in range(3) for y in range(3) if x != y])
# [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
甚至使用多個條件(if)。
print([ (x, y) for x in range(4) if x % 2 == 0 for y in range(4) if y % 2 == 1]) 
# [(0, 1), (0, 3), (2, 1), (2, 3)]
說穿了這些功能都可以用 for 作到,包括 Reduce,但簡潔的語法看起來就比較厲害一點。

官方文件
---
---
---

沒有留言:

張貼留言