我可能没有正确地问:我想要一个可以匹配任何列表的列表值:(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,)
无法匹配),那就太棒了
由于 路易斯
答案 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__()
的任何内容,并提醒读者集合将比列表更快。