filter
仅接受一个可迭代的对象,而map
接受可变数量的可迭代对象。例如,我可能会耗尽map(operator.add, [1, 2, 3, 4], [1, 2, 2, 4])
得到[2, 4, 5, 8]
。
我正在寻找一种类似的机制filter
,接受任何谓词和可变数量的可迭代对象。穷举filter(operator.eq, [1, 2, 3, 4], [1, 2, 2, 4])
导致TypeError
关于如何filter
仅接受1个可迭代项而不是2个。
对于该特定情况([1, 2, 4], [1, 2, 4])
,我的预期输出是,即operator.eq
删除不满足的成对元素。
这是我到目前为止的内容(渴望的版本仅支持2个可迭代变量,而不是N):
from typing import TypeVar, Callable, Iterable
A = TypeVar("A")
B = TypeVar("B")
def filter_(predicate: Callable[[A, B], bool], iterable1: Iterable[A], iterable2: Iterable[B]) -> (Iterable[A], Iterable[B]):
filtered_iterable1 = []
filtered_iterable2 = []
for value1, value2 in zip(iterable1, iterable2):
if predicate(value1, value2):
filtered_iterable1.append(value1)
filtered_iterable2.append(value2)
return filtered_iterable1, filtered_iterable2
但是,我的目标是1)能够支持N个可迭代对象,2)filter_
变得懒惰而不是像那样渴望filter
。
怎么样:
def filter_(predicate, *iterables):
for t in zip(*iterables):
if predicate(*t):
yield t
print(list(filter_(operator.eq, [1, 2, 3, 4], [1, 2, 2, 4])))
它是惰性的,它会[(1, 1), (2, 2), (4, 4)]
为您的测试用例输出,不,您不会([1, 2, 4], [1, 2, 4])
以惰性的方式得到结果。要从转换为[(1, 1), (2, 2), (4, 4)]
,([1, 2, 4], [1, 2, 4])
可以使用:zip(*filter_(operator.eq, [1, 2, 3, 4], [1, 2, 2, 4]))
但是,当然,您会失去懒惰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句