是否有一种简单的方法可以在一行中编码一系列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)
答案 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()
方法开始filter
,map
,reduce
,并通过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[:]))
在这种情况下,我们只是将列表子类化为新的列表方法。然后,您可以将map
,filter
和reduce
方法添加到课程中。我已经展示了如何添加map
方法。其他功能将非常相似。
请注意,在这种情况下,您可以根据需要链接map
和filter
函数,但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]