Очистить код для последовательности функций map/filter/reduce

Есть ли простой способ закодировать в одной строке последовательность функций 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)

Ответ 1

Вы можете использовать свой собственный список:

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]

Ответ 2

Если вы можете использовать внешнюю библиотеку, найдите

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

Это порт python underscore.js. Поэтому вы можете использовать метод 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 и, кажется, работал нормально.

Ответ 3

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