作者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://webptt.com/cn.aspx?n=bbs/Python/M.1527130178.A.0B7.html
1F:推 Yshuan: 将map换成filter, 出来的就会直接是你要的. 05/24 10:58
※ 编辑: clsmbstu (203.74.120.191), 05/24/2018 11:38:53
2F:→ clsmbstu: Thanks!! 多学到一招~ 05/24 11:59
3F:推 Neisseria: list comprehensions 或一些函数式程式相关函式 05/24 12:17
4F:→ Neisseria: 要 vector 通常是用 NumPy 为基础的套件 05/24 12:17
5F:推 ThxThx: functional programming的做法在Python里面比较不常用 05/24 14:12
6F:→ ThxThx: 通常会用list comprehension而不用map和filter 05/24 14:12
7F:→ ThxThx: pipe的本质就是一个接受一个参数的函式 05/24 14:12
8F:→ ThxThx: 我Python很熟很不能接受R这个语言(非常不适应... 05/24 14:12
9F:→ ThxThx: 同样我想用R的思维很难把Python写好 05/24 14:12
10F:→ clsmbstu: 我知道了 感谢楼上两位! 05/24 18:25