gpt4 book ai didi

python - python中多个谓词调用ifilter的简洁方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:13 27 4
gpt4 key购买 nike

我正在通过一个脚本流式传输一个非常大的集合,目前我在一个简单的调用中使用 ifilter 来拒绝某些值,即:

ifilter(lambda x: x in accept_list, read_records(filename))

那是一个谓词,但现在我想到我应该添加另一个,并且我可能希望在将来添加其他谓词。直接的方法是嵌套一个 ifilter 调用:

ifilter(lambda x : x not in block_list,
ifilter(lambda x: x in accept_list, read_records(filename)))

我正在考虑简单地将谓词作为未绑定(bind)函数放在列表中并为此使用它们。这些重复的 ifilter 调用似乎很难在那里实现(并且可能不是最佳选择)。也许我可以构造一个调用所有谓词的函数,但我如何尽可能简洁地(同时仍然可读)编写它?

最佳答案

您可以编写以下函数:

def conjoin(*fns):
def conjoined(x):
for fn in fns:
if not fn(x): return False
return True
return conjoined

你可以这样调用它:

ifilter(conjoined(lambda x: x not in block_list, lambda x: x in accept_list),
read_records(filename))

并且您可以为-ing 函数实现类似的disjoin 函数:

def disjoin(*fns):
def disjoined(x):
for fn in fns:
if fn(x): return True
return False
return disjoined

可能有更好的方法来实现它们,但必须小心。人们可能会尝试将每个函数应用于 x 并使用 allany,但这是不可取的,因为使用它们需要评估每个谓词争论。这里介绍的解决方案是令人满意的短路。

另外,为了好玩,让我们实现一个invert函数

def invert(fn):
return lambda x: not fn(x)

现在,我们有一个 functionally complete一组函数操作函数,并且可以从这些函数中构造任何逻辑操作:)

关于python - python中多个谓词调用ifilter的简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141958/

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