【问题标题】:python list that matches everything匹配所有内容的python列表
【发布时间】:2010-01-07 11:14:21
【问题描述】:

我可能没问对:我想要一个可以匹配任何列表的列表值:(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 中使用列表推导进行一些过滤。

如果我这样做:

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

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

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

我可以这样做:

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

但它不会与其余部分同质

我尝试了一些方法,但例如 (True,) 仅匹配 1

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

谢谢 路易斯

【问题讨论】:

  • list 是一个保留字,你不应该使用它作为标识符。
  • 确实:这仅用于演示目的:我还是删除了它
  • 也许你可以发布一个你想要的例子?假设你有my_list = [1, 2, None, 4]filter_list = [2]`应该是什么输出。添加您自己的输入
  • @Louis:请删除旧问题;这没有道理。实际上最好删除这个问题并重新开始一个全新的问题。
  • 请注意,(None,) 并非完全匹配:它会计算 None。你想什么都不匹配的是()

标签: python filtering list-comprehension


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    更好的语法是:

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

    【讨论】:

      【解决方案3】:

      什么意思

      我希望有相同的东西来匹配一切

      做事

      [x for x in list]
      

      list 中的每一项都匹配。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          【解决方案5】:

          你不需要if,你可以说

          [x for x in list]
          

          【讨论】:

          • 你如何证明这一点:>>> l = [None, 1, 3] >>> [x for x in l] [None, 1, 3]
          • @aatifh: 这不是 python 语法
          • if 是因为我过滤了一个字段:ti 现在是正确的问题
          【解决方案6】:

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

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

          [x for x in list1]
          

          或者如果你真的喜欢这样做

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

          【讨论】:

            【解决方案7】:

            回答您修改后的问题:“匹配”所有可能值的列表实际上是无限长的。因此,如果没有 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__() 的东西,并提醒读者集合会比列表更快。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-04-13
              • 2011-03-12
              • 1970-01-01
              • 1970-01-01
              • 2017-09-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多