匹配所有内容的python列表

时间:2010-01-07 11:14:21

标签: python filtering list-comprehension

我可能没有正确地问:我想要一个可以匹配任何列表的列表值:(None,)的“逆” 但即使使用(None,),它也会将项目匹配为无(我不想要)

关键是我有一个使用的功能:[x for x in my_list if x[field] not in filter_list]

我希望在没有进行如下测试的情况下过滤所有内容或任何内容: if filter_list==(None,): return []if filter_list==('*',): return my_list

PS:我想简化我的问题导致一些错误(list标识符)或愚蠢的事情[x for x in x];)


您好,

我需要在python中使用list comprehension进行一些过滤。

如果我这样做的话:

[x for x in list if x in (None,)]

我摆脱了所有的价值,这很好

但是我希望有相同的东西来匹配所有内容

我可以做类似的事情:

[x for x in list if x not in (None,)]

但与其余部分不一致

我尝试过一些事情,但例如(True,)仅匹配1

请注意,要过滤的值是数字,但如果您有一些通用的内容(例如(None,)无法匹配),那就太棒了

由于 路易斯

7 个答案:

答案 0 :(得分:5)

__contains__是检查序列中是否存在某些内容的神奇方法:

class everything(object):
    def __contains__(self, _):
        return True           

for x in (1,2,3):
    print x in everything()

答案 1 :(得分:4)

更好的语法是:

[x for x in lst if x is None]
[x for x in lst if x is not None]

答案 2 :(得分:3)

你是什么意思

  

我希望有相同的东西来匹配所有内容

只做

[x for x in list]

list中的每个项目都匹配。

答案 3 :(得分:3)

您可以将程序更改为接受过滤器对象,而不是列表。

抽象基过滤器有一个matches方法,如果x *匹配“,则返回true。

您的一般案例过滤器将使用list参数构建,并将过滤列表的成员资格 - matches函数将搜索列表,如果参数在列表中,则返回true

您还可以使用filter对象的两个特殊子类:none和all。

这些函数将具有特殊匹配函数,这些函数始终返回true(全部)或false(无)。

答案 4 :(得分:0)

您不需要if,您可以说

[x for x in list]

答案 5 :(得分:0)

  

但我想也一样   匹配一切的东西

要匹配所有内容,您不需要if语句

[x for x in list1]

或者如果你真的想做

[x for x in list1 if x in [x]]

答案 6 :(得分:0)

回答您修改后的问题:“匹配”所有可能值的列表实际上具有无限长度。因此,如果没有if测试,你就无法做你想做的事。我建议你的arg应该是一个列表,或者是代表“所有”和“无”情况的两个值中的一个:

FILTER_NONE = object() # or []
FILTER_ALL = object()

def filter_func(alist, filter_list):
    if filter_list is FILTER_ALL:
        return []
    elif filter_list is FILTER_NONE:
        return alist
        # or maybe alist[:] # copy the list
    return [x for x in alist if x not in filter_list]

如果filter_list很大,您可能希望将最后一行替换为:

    filter_set = set(filter_list)
    return [x for x in alist if x not in filter_set]

或者,不要打扰;只是文档filter_list(重命名为filter_collection)可以是支持__contains__()的任何内容,并提醒读者集合将比列表更快。