gpt4 book ai didi

python - 如何将 `filter` 与多个可迭代对象一起使用,正如 `map` 所支持的那样?

转载 作者:行者123 更新时间:2023-12-04 16:40:14 25 4
gpt4 key购买 nike

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]),即不满足 运算符的成对元素。 eq 被删除。

这是我目前所拥有的(eager 版本只支持 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 一样。

最佳答案

不幸的是,没有像 starfilter 这样的 starmap 等价物,所以我能想到的等价物是:

[i for i in zip(*lists) if predicate(*i)]

lists 类似于 ([..], [..])。这导致:

[(1, 1), (2, 2), (4, 4)]

要将其变回单独的列表,请使用 tuple(map(list, zip(*result))):

([1, 2, 4], [1, 2, 4])

所以,把它放在一起:

predicate = operator.eq
lists = [1, 2, 3, 4], [1, 2, 2, 4]

result = tuple(map(list, zip(*(i for i in zip(*lists) if predicate(*i)))))

关于python - 如何将 `filter` 与多个可迭代对象一起使用,正如 `map` 所支持的那样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62190245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com