是否有人知道一个函数/习语(用任何语言)接受一个集并返回两个或多个子集,由一个或多个谓词决定?
很容易以命令式的方式做到这一点,例如:
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]]
答案 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
方法可以完成您所描述的内容。