2011-12-26 12 views
8

si sa come flatmap prende una sequenza di oggetti e converte ciascuno in una nuova sottosequenza, aggregando tutte le sottosequenze:L'opposto funzionale di Flatmap?

[A, B, C] -> [A1, A2, B1, B2, B3, C1] 

C'è un nome per la trasformazione, che fa il contrario? Qualcosa di simile:

[A1, A2, B1, B2, B3, C1] -> [A, B, C] 

L'esempio specifico che mi ha fatto pensare a questo stava facendo la valutazione delle espressioni matematiche:

1 * 2 + 3 * 4 + 5 + 6 * 7 * 8 
-> 2 + 12 + 5 + 6 + 336 
-> 361 

Individualmente, la valutazione del 6 * 7 * 8 sembra un classico reduce passo, mentre decidere quale i blocchi devono essere ridotti avrebbero bisogno di ripetuti passaggi takeWhile.

So come farlo nel modo iterativo classico, tenendo traccia degli indici e tutto il resto. Per la maggior parte dei casi, ho trovato una buona sostituzione funzionale per la maggior parte dei modelli iterativi. C'è un nome per una singola operazione che fa questo, o un semplice insieme di operazioni che possono essere composte per creare questo effetto?

risposta

6

Penso che il contrario di flatmap sia groupby.

$ python3 
>>> from itertools import groupby 
>>> groupby(['A1', 'A2', 'B1', 'B2', 'B3', 'C1'], lambda x: x[0]) 
+0

Questo dovrebbe essere contrassegnato come corretto. – Robert