Функциональная противоположность плоской карте? - PullRequest
9 голосов
/ 26 декабря 2011

Вы знаете, как flatmap берет последовательность элементов и преобразует каждый из них в новую подпоследовательность, объединяя все подпоследовательности:

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

Есть ли название для преобразования, которое делает обратное? Что-то вроде:

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

Конкретным примером, который заставил меня задуматься об этом, была оценка математических выражений:

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

По отдельности, оценка 6 * 7 * 8 выглядит как классический reduce шаг, в то время как решение о том, какие блоки должны быть сокращены, потребует повторных takeWhile шагов.

Я знаю, как сделать это классическим итеративным способом, отслеживая индексы и все такое. В большинстве случаев я нашел хорошую функциональную замену большинству итерационных шаблонов. Есть ли имя для отдельной операции, которая делает это, или простой набор операций, который может быть составлен для создания этого эффекта?

1 Ответ

9 голосов
/ 26 декабря 2011

Я думаю, что противоположностью flatmap является groupby.

$ python3
>>> from itertools import groupby
>>> groupby(['A1', 'A2', 'B1', 'B2', 'B3', 'C1'], lambda x: x[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...