我正在通过一个脚本流式传输一个非常大的集合,并且当前在一个简单的调用中使用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)))我正在考虑简单地将谓词作为未绑定的函数放在列表中,并将它们用于此目的。然而,这些重复的ifilter调用似乎很难在那里实现(而且可能不是最佳选择)。也许我可以构造一个调用所有谓词的函数,但是我如何写得尽可能简洁(同时仍然可读)呢?
发布于 2010-06-30 09:13:27
您可以编写以下函数:
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))你可以一起实现一个类似的disjoin函数来实现或-ing函数:
def disjoin(*fns):
def disjoined(x):
for fn in fns:
if fn(x): return True
return False
return disjoined可能有一种更好的方法来实现它们,但必须小心。可以尝试将每个函数应用于x并使用all或any,但这是不可取的,因为使用它们将需要计算参数上的每个谓词。这里提出的解决方案是令人满意的短路。
另外,为了好玩,让我们实现一个invert函数
def invert(fn):
return lambda x: not fn(x)现在,我们有了一组处理函数的functionally complete函数,并且可以构造这些函数的任何逻辑操作:)
发布于 2010-06-29 23:10:28
我将坚持以下解决方案:
def complex_predicate(x):
return x not in block_list and x in accept_list and is_good(x)或
def complex_predicate2(x):
return all([x not in block_list, x in accept_list, is_good(x)])然后
ifilter(complex_predicate, read_records(filename))或者complex_predicate2也是如此。
但是,我认为这是一个品味的问题。
发布于 2011-08-17 20:31:00
如果只有两个谓词,我会想出以下几个:
ifilter(lambda x: x in accept_list and x not in block_list, read_records(filename))此外,正如上面提到的,如果有两个以上的谓词,最好将所有谓词放在特定函数中。使用all使条件块变得不那么凌乱(因为在本例中,所有谓词都用逗号分隔)。
https://stackoverflow.com/questions/3141958
复制相似问题