作者clsmbstu (missing)
看板Python
標題[問題] 請問pipe operator以及vectorization
時間Thu May 24 10:49:34 2018
剛開始接觸Python幾個月,有兩個問題想要請教:
1. Python有大家比較常用的pipe operator嗎?
例如shell有`|`;
R透過套件可以有`%>%`(類似shell的`|`)、
甚至`%<>%`(把後方執行的結果再assign回去,像是Python的`+=`的萬用版)。
我對這種寫法已經有點習慣,
想請問在Python實現的方式是?
我搜尋了一下SO,有發現幾篇,但大家寫的都不一樣:
-
https://stackoverflow.com/q/5988665/6666231
-
https://stackoverflow.com/q/28252585/6666231
請問大家,有比較常用或推薦的嗎?
2. Python的vectorization要怎麼實現?
```r
strings <- c("dogs", "cats", "doggies", "I have a dog")
mask <- grepl("^dog", strings)
mask
# TRUE FALSE TRUE FALSE
strings[mask]
# "dogs" "doggies"
```
上面的意思是:
在"dogs"、"cats"、"doggies"、"I have a dog"中找"dog"開頭的字串,
並且回傳是否存在的邏輯值,存成物件`mask`。
`string[mask]`則是直接用邏輯值回傳符合條件的元素。
由於R語言的特性是內建vectorization的概念,
到了Python好像每件事都變得棘手:
```python
import re
strings = ["dogs", "cats", "doggies", "I have a dog"]
mask = list(map(lambda string: True if re.match("dog", string) else False,
strings))
mask
# [True, False, True, False]
strings[mask]
# TypeError: list indices must be integers or slices, not list
```
產生`mask`時變成我要自建一個function再`map`它,
雖然只是`lambda`但還是覺得多了一步,
想請問有沒有別的方法?
接下來`strings[mask]`更是直接爆炸 囧...
我看了一下itertools,但好像不是用在這種地方?
請問Python內上述的vectorization要怎麼實現呢?
PS: 我自認對R滿熟悉的,所以如果用R來類比說明我很能接受。謝謝!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 203.74.120.191
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1527130178.A.0B7.html
推 Yshuan: 將map換成filter, 出來的就會直接是你要的. 05/24 10:58
※ 編輯: clsmbstu (203.74.120.191), 05/24/2018 11:38:53
→ clsmbstu: Thanks!! 多學到一招~ 05/24 11:59
推 Neisseria: list comprehensions 或一些函數式程式相關函式 05/24 12:17
→ Neisseria: 要 vector 通常是用 NumPy 為基礎的套件 05/24 12:17
推 ThxThx: functional programming的做法在Python裡面比較不常用 05/24 14:12
→ ThxThx: 通常會用list comprehension而不用map和filter 05/24 14:12
→ ThxThx: pipe的本質就是一個接受一個參數的函式 05/24 14:12
→ ThxThx: 我Python很熟很不能接受R這個語言(非常不適應... 05/24 14:12
→ ThxThx: 同樣我想用R的思維很難把Python寫好 05/24 14:12
→ clsmbstu: 我知道了 感謝樓上兩位! 05/24 18:25