作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!