1

我可能没有正确地问:我想要一个可以匹配任何列表的列表值:(None,) 但即使使用(None,)它的“逆”也会将 item 匹配为 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 中使用列表理解进行一些过滤。

如果我这样做:

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

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

但我想有同样的东西来匹配一切

我可以做类似的事情:

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

但它不会与其余部分同质

我尝试了一些东西,但例如(True,)只匹配 1

请注意,要过滤的值是数字,但如果你有一些通用的东西(比如(None,)什么都不匹配),那就太好了

谢谢路易斯

4

7 回答 7

5

__contains__是检查某物是否在序列中的神奇方法:

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

for x in (1,2,3):
    print x in everything()
于 2010-01-07T15:07:46.737 回答
4

更好的语法是:

[x for x in lst if x is None]
[x for x in lst if x is not None]
于 2010-01-07T11:16:17.073 回答
3

你是什​​么意思

我想拥有相同的东西来匹配一切

做就是了

[x for x in list]

并且其中的每个项目list都是匹配的。

于 2010-01-07T11:17:16.527 回答
3

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

抽象基本过滤器将有一个matches方法,如果 x *matches" 则返回 true。

您的一般案例过滤器将使用列表参数构造,并根据列表的成员资格进行过滤 - 如果参数在列表中,该matches函数将搜索列表并返回true

您还可以拥有过滤器对象的两个特殊子类:none 和 all。

这些将具有特殊的匹配函数,它们总是返回true(全部)或false(无)。

于 2010-01-07T14:49:58.673 回答
0

你不需要 a if,你可以说

[x for x in list]
于 2010-01-07T11:17:01.783 回答
0

但我想有同样的东西来匹配一切

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

[x for x in list1]

或者如果你真的喜欢做

[x for x in list1 if x in [x]]
于 2010-01-07T11:19:00.207 回答
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__()并提醒读者集合比列表更快的东西。

于 2010-01-07T14:41:29.487 回答