用于列表理解的Python动态过滤器?

2024-04-19 07:48:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个方法,根据提供的操作符或函数来过滤给定的对象列表。在

现在我的方法如下:

def filter_by_names(objects, names, exclude=False):
    if exclude:
        return [obj for obj in objects if obj.name not in names]
    else:
        return [obj for obj in objects if obj.name in names]

现在它有两个过滤器选项,如果对象的名称在“提供的名称”列表中,则返回该对象;或者执行相反的操作:返回名称不在“提供的名称”列表中的对象。在

我想要的是能够动态地指定如何过滤。我虽然使用operator库,但似乎没有not in运算符,所以我需要将in与{}结合起来,这有点笨拙。在

我想用lambda就像:

^{pr2}$

这个很管用,但我想知道有没有更好的方法来做这样的事情?对于lambda,我总是需要指定整个函数,即使我只需要不同的运算符。在


Tags: 对象方法函数namein名称obj列表
3条回答

例如,使用xor运算符如何

>>> n = range(0,11,2)
>>> n
[0, 2, 4, 6, 8, 10]
>>> exclude = True
>>> [ x for x in range(10) if (x in n) ^ exclude ] # only the one that are not in n
[1, 3, 5, 7, 9]
>>> exclude = False
>>> [ x for x in range(10) if (x in n) ^ exclude ] # only the one that are also in n
[0, 2, 4, 6, 8]
>>> 

这是因为equals的xor结果是false,而different的xor结果是true

def filter_by_names(objects, names, exclude=False):
    return [obj for obj in objects if (obj.name in names) == (not exclude)]

使用not exclude(而不是(obj.name not in names) == exclude))编写它,可以为“exclude”传递任意的truthy/falsy值,而不仅仅是True或False。在

从Pythonoperators开始。contains和{}应该足够给你想要的控制。然而,这将仅仅比您当前的代码短,并且结果更难阅读。另一方面,对于下一步要配置什么,这应该会给您提供很多可爱的想法。在

相关问题 更多 >