Очистить код для последовательности функций 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