功能样式中的多重集合理解

时间:2011-01-13 16:57:50

标签: functional-programming

是否有人知道一个函数/习语(用任何语言)接受一个集并返回两个或多个子集,由一个或多个谓词决定?

很容易以命令式的方式做到这一点,例如:

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个或更多个 bins 二元谓词或多个谓词。

我能提出的最新语法是:

>> 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 个答案:

答案 0 :(得分:2)

搜索(a -> Bool) -> [a] -> ([a], [a]) on 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中使用起来有点棘手。

答案 1 :(得分:0)

Ruby的Enumerable mixin有一个partition方法可以完成您所描述的内容。