Многократное понимание в функциональном стиле - PullRequest
0 голосов
/ 13 января 2011

Кто-нибудь знает о функции / идиоме (на любом языке), которая принимает набор и возвращает два или более подмножества, определенных одним или несколькими предикатами?

Это легко сделать в императивестиль, например:

a = b = []

for x in range(10):
    if even(x):
        a.append(x)
    else:
        b.append(x)

или чуть лучше:

[even(x) and a.append(x) or b.append(x) for x in range(10)]

Так как понимание набора возвращает один список, основанный на одном предикате (и это фактически просто карта), я думаю, что следуетбыть чем-то, что разбивает входные данные на 2 или более бинов на основе либо двоичного предиката, либо нескольких предикатов.

Самый подходящий синтаксис, который я могу придумать:

>> def partition(iterable, *functions):
>>    return [filter(f,iterable) for f in functions]
>> partition(range(10), lambda x: bool(x%2), lambda x: x == 2)
[[1, 3, 5, 7, 9], [2]]

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Поиск (a -> Bool) -> [a] -> ([a], [a]) в Hoogle доходность Data.List.partition.

Функция partition принимает предикат списка и возвращает парусписков элементов, которые соответствуют и не удовлетворяют предикату соответственно;то есть,

partition p xs == (filter p xs, filter (not . p) xs)

Если вы посмотрите на его источник и переведете на Python,

def partition(predicate, sequence):
    def select((yes, no), value):
        if predicate(value):
            return (yes + [value], no)
        else:
            return (yes, no + [value])
    return reduce(select, sequence, ([], []))

, который довольно приятен в работе.В отличие от оригинала, он не ленивый, но немного сложнее в Python.

0 голосов
/ 13 января 2011

Ruby's Enumerable mixin имеет метод partition, который делает то, что вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...