问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

帅到爆炸!使用管道 Pipe 编写 Python 代码竟如此简洁

发布网友 发布时间:2024-10-13 21:03

我来回答

1个回答

热心网友 时间:2024-12-04 11:33

众所周知,Pytnon 非常擅长处理数据,尤其是后期数据的清洗工作。今天就给大家介绍一款处理数据的神器 Pipe。

什么是 Pipe 简言之,Pipe 是 Python 的一个三方库。

通过 Pipe 我们可以将一个函数的处理结果传递给另外一个函数,这意味着你的代码会非常简洁。

要使用 Pipe 需要提前安装,直接使用 pip 安装即可。

pip install pipe

过滤元素 和 filter 类似,pipe 中的 where 操作可以过滤可迭代对象中的元素。

In [5]: numbers = [0, 1, 2, 3, 4, 5]In [6]: list(numbers | where(lambda x: x % 2 == 0))Out[6]: [0, 2, 4]

作用元素 类似 map,select 操作可以将函数作用于可迭代对象中的每个元素。下面的例子中我们将列表中的元素都扩大 2 倍。

In [8]: list(numbers | select(lambda x: x * 2))Out[8]: [0, 2, 4, 6, 8, 10]

当然,还可以将多种操作合并在一起来玩。

下面的例子就是将列表中的偶数挑选出来并扩大 2 倍,和 filter 与 map 不同的是,pipe 可以将多个操作连接起来,就像水管套水管一样,所以我想管道这个名字也是很接地气了。

In [10]: list(numbers...: | where(lambda x: x % 2 == 0)...: | select(lambda x: x * 2)...:)...:Out[10]: [0, 4, 8]

连接元素 操作嵌套列表时非常痛苦,值得高兴的是 pipe 给出了很友好的接口,只需要 chain 一下即可。

In [11]: list([[1, 2], [3, 4], [5]] | chain)Out[11]: [1, 2, 3, 4, 5]In [30]: list((1, 2, 3) | chain_with([4, 5], [6]))Out[30]: [1, 2, 3, 4, 5, 6]In [31]: list((1, 2, 3) | chain_with([4, 5], [6,[7]]))Out[31]: [1, 2, 3, 4, 5, 6, [7]]

如你所见,chain 只可以拆开一层,如果要拆开多层嵌套的话,不要慌,traverse 轻松搞定。

In [12]: list([[1, 2], [[[3], [[4]]], [5]]] | traverse)Out[12]: [1, 2, 3, 4, 5]

结合 select 一起,获取字典中的某个字段属性集合。

In [32]: fruits = [...: {"name": "apple", "price": [2, 5]},...: {"name": "orange", "price": 4},...: {"name": "grape", "price": 5},...: ]In [33]: list(fruits...:| select(lambda fruit: fruit["price"])...:| traverse)...:Out[33]: [2, 5, 4, 5]

分组 对列表中的元素进行分组是必不可少的,在 pipe 中可以使用 groupby 来完成。

In [26]: list(numbers...:| groupby(lambda x: 'Even' if x % 2 == 0 else 'Odd')...:| select(lambda x: {x[0]: list(x[1])})...: )...:Out[26]: [{'Even': [0, 2, 4]}, {'Odd': [1, 3, 5]}]

同样,还可以在 select 中添加 where 过滤条件。

In [27]: list(numbers...:| groupby(lambda x: 'Even' if x % 2 == 0 else 'Odd')...:| select(lambda x: {x[0]: list(x[1] | where(lambda x: x > 2))})...: )...:Out[27]: [{'Even': [4]}, {'Odd': [3, 5]}]

行列互换 数据处理中时常会用到行列互相转换,尤其是在用 DataFrame 时,使用 pipe 一行代码搞定行列转换。

In [24]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] | transposeOut[24]: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

删除元素 对列表去重也是一项常用的操作,在 pipe 中使用 dep 来对列表进行去重。

In [28]: list([1, 1, 2, 2, 3, 3, 1, 2, 3] | dep)Out[28]: [1, 2, 3]

与 dep 不同的是,uniq 只会对连续的重复元素保留一个,非连续重复元素则不过滤。

In [8]: list(numbers | select(lambda x: x * 2))Out[8]: [0, 2, 4, 6, 8, 10]0

总结 今天给大家介绍了一个处理数据的神器,使用管道可以让繁琐的操作浓缩在几行甚至一行代码搞定,提高可读性的同时还提升了代码的整洁程度,美滋滋~

以上就是本次分享的所有内容,想要了解更多欢迎前往公众号:Python 编程学习圈,每日干货分享

原文:https://juejin.cn/post/7103779880919105549
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
康复者的血清中含有什么免疫分子 血清里面有什么 走读的定义在哪些教育阶段适用? PostgreSQL修改数据库表的列属性操作 Ubuntu调整postgresql默认路径 ubuntu – Postgresql:更改默认数据路径 刘邦几个老婆刘邦老婆吕雉和戚夫人的不同结局 刘邦几个老婆?. 如何防止父母在微信群里抢红包? 有哪些适合夏天选择的长裙款式值得推荐? 面试官问:Stream 中的 map、peek、foreach 方法的区别?彻底懵了。。 请问哪位大神知道深圳市龙岗亿通鼎业投资担保有限公司是骗子吗? 深圳市亿通科技有限公司亿通历史‍ Y亿通手机是名牌吗? 深圳市亿通科技有限公司怎么样? 96万直男发问:阿拉伯语专业的何炅,水平几乎为零,为什么还自称老师... 贴墙仪如何使用方法 asp上传图片 提交后总是显示下载提示框。不知是代码的还是设置的问题... 奔腾B70怠速外面听发动机声音有点大 奔腾b70排气管松动给油有异响 我的14款奔腾b70怠速车子没什么声音加油机器声音大的吓人怎么破?_百度... 梦到两个死人,都是男的,他们藏在柜子里,有一个好像被我爸爸杀了,令一... 做梦梦见能看见死人的魂,还有自己的男朋友。昨晚睡觉的时候梦见好几个... 临沧自然地理 唱歌随笔作文150字一年级写事作文 去KTV唱歌作文300字 雷霆扫毒韦世乐去陈家碧家的是哪集(图) 梦里总是出现的人意味着什么经常出现在梦里的人 为什么有的梦里面总有个熟悉的人 克朗巴哈是哪个国家的 ...当重复的元素中一个插入数据其他重复的数据同样的插入 如何实现_百度... 面试官问线程安全的List,看完再也不怕了! java中一个list,如果比较出里面哪几个重复 超级跑跑 被遗弃的玩具峡谷怎么判断积木能通过的 超级跑跑怎么DJ跳,要详细点 飞利浦rq1250和rq1251哪个贵 贷款两万五千元,年利率是8.55,按季付息,那每季度应付多少利息钱 8厘利息25000元11个月是多少钱 这个QQ表情上的鸡(鸟)叫什么啊 求彼尔德qq表情,怎么才能下到安卓手机上啊? 大专学生想要提升学历有些什么方法? 想提高学历除了考研还有什么? 我两个户口如何处理、找个懂法的指示指示、高分悬赏 关于集体户口迁出的疑问?高手回答,高分悬赏 笔记本上中间这个小灯怎么弄灭呢,求大神指点 笔记本电脑键盘上有一个键是有一点点小灯亮着的,请问有什么用呢?那个键... PPT中插入的visio图片如何裁剪visio2003裁剪图片 为什么我把专辑封面插到ipod里,图片一片漆黑呢 看手指甲自测疾病图 ipod添加专辑图片问题