2011-12-26 17 views
8

Wiesz jak flatmap wykonuje sekwencję elementów i przetwarza każdą z nich do nowego podciągu, sumując wszystkie podsekwencje:Funkcjonalne przeciwieństwo płaskiej mapy?

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

jest tam nazwa transformacji, która robi coś przeciwnego? Coś jak:

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

konkretnym przykładzie, że dało mi do myślenia o tym robi oceny wyrażeń matematycznych:

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

Indywidualnie, ewaluacja 6 * 7 * 8 wydaje się klasycznym reduce krokiem przy podejmowaniu decyzji, które bloki muszą zostać zmniejszone, wymagałyby powtórzenia kroków: takeWhile.

Wiem, jak to zrobić w klasyczny sposób iteracyjny, śledzenie indeksów i tak dalej. W większości przypadków znalazłem przyjemny funkcjonalny zamiennik dla większości powtarzających się wzorców. Czy istnieje nazwa pojedynczej operacji, która to robi, lub prosty zestaw operacji, które można skomponować, aby stworzyć ten efekt?

Odpowiedz

6

Myślę, że przeciwieństwem flatmap jest groupby.

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

To powinno być oznaczone jako poprawne. – Robert