Python map/filter/reduce函数序列的干净代码

Python map/filter/reduce函数序列的干净代码,python,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) 如果你能使用外文图书馆,寻找 它是pyth

有没有一种简单的方法可以在一行中编码一系列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)

如果你能使用外文图书馆,寻找

它是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中进行了测试,看起来效果不错。

您可以使用自己的列表:

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]

PyFunctional
允许您在安装后通过
pip安装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)
这个软件包可以做更多的事情,你可以在

你为什么不习惯在一行中放这么多东西?有3行或更多行有什么不对?@Marcin这是暴露于Scala的效果……这是python中最奇怪的事情之一。当等价的java代码变小时,你知道这是疯狂的
list.stream().map(x->x-1)、filter(x->x>0)、reduce((x,y)->x*y)
我最近遇到了这个“问题”。我目前正在工作中使用Python,我错过了Scala中的函数语法/样式。我从@ssm中得到了这个想法,并将其扩展到了一个包的初始版本,希望它能提供与链接数据上的函数调用类似的感觉。我完全愿意接受反馈,不久前才完成了第一个版本:和