2014-12-01 17 views
12

C'è un modo semplice per codificare in una riga una sequenza di mappa/filtro/ridurre le funzioni?Pulisci codice per sequenza di mappa/filtro/riduci le funzioni

Per esempio, invece di:

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

Sto cercando qualcosa di simile:

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

Perché dovresti mettere così tante cose in una riga? Cosa c'è di sbagliato in avere 3 linee o più? – Marcin

+2

@Marcin È l'effetto di essere esposti a Scala ... – iliasfl

risposta

7

PyFunctional ti permette di fare esattamente questo dopo l'installazione tramite 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) 

Il pacchetto può fare molto di più di quello che è possibile verifica a github.com/EntilZha/PyFunctional

8

Se è possibile utilizzare libreria di stranieri, per cercare

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

E ' porta python di underscore.js. Pertanto è possibile utilizzare il metodo chain() per iniziare filter, map, reduce e ottenere il risultato tramite il metodo value().

Usando questa libreria, è possibile scrivere qualcosa di simile a

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() 

ho provato in Python 3.4.2 e sembra funzionare bene.

5

È possibile utilizzare la propria lista:

class Mylist(list): 

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

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

In questo caso, abbiamo appena sottoclasse l'elenco a un nuovo metodo di lista. Quindi, è possibile aggiungere alla classe i metodi map, filter e reduce. Ho mostrato come aggiungere il metodo map. Le altre funzioni saranno molto simili.

nota che in questo caso, è possibile concatenare le funzioni map e filter quanto si vuole, ma il metodo reduce generalmente non risultato in un elenco che non sarà possibile funzioni catena più.

Ecco un esempio di output:

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] 
+1

Ho riscontrato questo "problema" di recente. Attualmente sto usando Python al lavoro e ho perso la sintassi funzionale/stile di Scala. Ho preso l'idea da @ssm e l'ho estesa ad una versione iniziale di un pacchetto che, auspicabilmente, fornisce la stessa sensazione per concatenare le chiamate di funzione sui dati. Sono totalmente aperto al feedback e ho appena finito la prima versione poco fa: https://pypi.python.org/pypi/ScalaFunctional/0.0.0 e https://github.com/EntilZha/ScalaFunctional – Keiga

Problemi correlati