map
和filter
是Python中的两种高效函数,用于处理可迭代对象。然而,如果你同时使用map
和filter
,代码会显得很乱。
如果你能像下面这样使用管道|在一个迭代器上应用多个方法,那不是很好吗?
什么是Pipe?
Pipe[1]是一个Python库,使你能够在Python中使用管道。一个管道(|
)将一个方法的结果传递给另一个方法。
Pipe很受欢迎,因为它使我们的代码在对Python迭代器应用多种方法时看起来更干净。由于Pipe中的函数屈指可数,所以学习Pipe也非常容易。在这篇文章中,云朵君将和大家一起学习这个很酷的方法~
首先需要安装Pipe:
pip install pipe
Where
迭代器中的过滤元素--where
与SQL类似,Pipe的where
方法也可以用来过滤迭代表中的元素。
Select
将一个函数应用到一个迭代器上—select
select
方法与map
方法类似。select
将一个方法应用于迭代器的每个元素。
在下面的代码中,我使用select
将列表中的每个元素乘以2。
现在,你可能想知道:如果where
和select
的功能与map
和filter
相同,我们为什么还需要这些方法?
因为可以使用管道在另一个方法之后插入一个方法。因此,使用管道可以去除嵌套的小括号,使代码更容易阅读。
Chain
迭代序列的链路--chain
处理嵌套的迭代器可能是一件很痛苦的事情。而我们可以使用chain来链接一连串的迭代变量。
尽管应用链式后迭代器的嵌套程度降低了,我们仍然有一个嵌套的列表。要处理一个深度嵌套的列表,可以使用 traverse
来代替。
Traverse
递归展开迭代器--traverse
traverse
方法可以用来递归地展开迭代器。因此,你可以用这个方法把一个深度嵌套的列表变成一个一维列表。
把这个方法和select
方法整合起来,以获得一个字典的值,并把列表扁平化。
列表中的元素分组
有时,使用某个函数对列表中的元素进行分组可能是有用的。这可以用groupby
方法轻松实现。
为了看看这个方法是如何工作的,把一个数字列表变成一个字典,根据数字是偶数还是奇数来分组。
在上面的代码中,我们使用groupby
将数字分组为Even
组和Odd
组。应用这个方法后的输出看起来像下面这样:
[('Even', <itertools._grouper at 0x7fbea8030550>),
('Odd', <itertools._grouper at 0x7fbea80309a0>)]
接下来,我们使用select
将一个元组变成一个字典的列表,其键是元组中的第一个元素,值是元组中的第二个元素。
[{'Even': [2, 4, 6, 8]},
{'Odd': [1, 3, 5, 7, 9]}]
为了只获得大于2的值,我们可以在选择方法中加入where
方法:
请注意,输出中不再有2和1。
Dedup
使用一个键来重复取值--dedup
dedup
方法删除列表中的重复部分。
这听起来可能没什么意思,因为set
方法可以做同样的事情。然而,这种方法更加灵活,因为它使你能够使用一个键获得独特的元素。
例如,你可以用这个方法来获得一个小于5的唯一元素和另一个大于或等于5的唯一元素。
现在,把这个方法与 select
和 where
结合起来,得到一个有重复键和 None
值的字典的值。
在上面的代码中,我们:
- 移除同名的元素
- 获得count的值
- 只选择整数的值。
在几行代码中,我们可以将多个方法应用于一个迭代器,同时仍然保持代码的简洁