Hoogle - хороший инструмент для этого. Вы можете ввести тип функции и просмотреть все функции с этим типом. В этом случае нам нужны в качестве входных данных: список a
и функция, которая принимает a
и возвращает логическое значение, а вывод представляет собой пару списков a
. В синтаксисе Haskell это (a -> Bool) -> [a] -> ([a], [a])
. Оттуда мы видим соответствующую функцию раздел . Реализация:
partition p xs == (filter p xs, filter (not . p) xs)
В Python:
partition = lambda p, xs: (filter(p, xs), filter(lambda f: not p(f), xs))
Или это быстрее, но немного страшнее, потому что это асимметрично:
partition = lambda p, xs: (filter(p, xs), [z for z in xs if not p(z)])
Это действительно удваивает количество вычислений, которое вам нужно, но я думаю, что вы должны сделать это, если у вас нет мутации.