清除map / filter / reduce函数序列的代码

时间:2014-12-01 05:27:04

标签: python

是否有一种简单的方法可以在一行中编码一系列map / filter / reduce函数?

例如,而不是:

reduce(lambda x, y: x*y, filter(lambda x: x>0, map(lambda x: x - 1, some_list)))

我正在寻找类似的东西:

some_list.map(lambda x: x -1, a).filter(lambda x: x>0).reduce(lambda x, y: x*y)

3 个答案:

答案 0 :(得分:19)

PyFunctional可让您在通过pip install PyFunctional

安装后完成此操作
from functional import seq

seq(some_list).map(lambda x: x -1, a).filter(lambda x: x>0).reduce(lambda x, y: x*y)

该套餐可以做更多的事情,你可以在那里结账 github.com/EntilZha/PyFunctional

答案 1 :(得分:9)

如果您可以使用外国图书馆,请寻找

https://github.com/serkanyersen/underscore.py

它是underscore.js的python端口。因此,您可以使用chain()方法开始filtermapreduce,并通过value()方法获得结果。

使用此库,您可以编写类似

的内容
from underscore import _
my_array = [10, 48, -1, 30, 20, 0]
result = _(my_array).chain().map(lambda x,*a: x - 1).filter(lambda x: x > 0).reduce(lambda x,y,*a: x*y, 1).value()

我在python 3.4.2中测试过,似乎工作正常。

答案 2 :(得分:5)

您可以使用自己的列表:

class Mylist(list):

    def __init__(self, l):
        list.__init__(self,l)

    def map(self, f):
        return Mylist(map(f, self[:]))

在这种情况下,我们只是将列表子类化为新的列表方法。然后,您可以将mapfilterreduce方法添加到课程中。我已经展示了如何添加map方法。其他功能将非常相似。

请注意,在这种情况下,您可以根据需要链接mapfilter函数,但reduce方法通常结果在列表中,不再可能链接函数。

以下是输出示例:

In [16]: xx = Mylist([1,2,3])

In [17]: xx.map(lambda m: m*2).map(lambda m: m**2)
Out[17]: [4, 16, 36]