【问题标题】:How to check if all of the following items are in a list?如何检查以下所有项目是否都在列表中?
【发布时间】:2011-04-25 07:07:47
【问题描述】:

我发现有一个相关的问题,关于如何查找列表中是否存在至少一项:
How to check if one of the following items is in a list?

但是,找出所有项目是否都存在于列表中的最好的 Pythonic 方法是什么?

通过文档搜索我找到了这个解决方案:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

其他解决方案是这样的:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

但是在这里你必须做更多的输入。

还有其他解决办法吗?

【问题讨论】:

标签: list python inclusion


【解决方案1】:

另一种解决方案是:

l = ['a', 'b', 'c']
potential_subset1 = ['a', 'b']
potential_subset2 = ['a', 'x']
print(False not in [i in l for i in potential_subset1]) # True
print(False not in [i in l for i in potential_subset2]) # False

让我的解决方案很棒的地方在于,您可以通过将列表内联来编写单行代码。

【讨论】:

    【解决方案2】:

    这是我在网上搜索的。不过很遗憾没有在网上找到,而是在试验python解释器的时候。

    >>> case  = "caseCamel"
    >>> label = "Case Camel"
    >>> list  = ["apple", "banana"]
    >>>
    >>> (case or label) in list
    False
    >>> list = ["apple", "caseCamel"]
    >>> (case or label) in list
    True
    >>> (case and label) in list
    False
    >>> list = ["case", "caseCamel", "Case Camel"]
    >>> (case and label) in list
    True
    >>>
    

    如果您在 sublist variable 中保存了一个很长的变量列表

    >>>
    >>> list  = ["case", "caseCamel", "Case Camel"]
    >>> label = "Case Camel"
    >>> case  = "caseCamel"
    >>>
    >>> sublist = ["unique banana", "very unique banana"]
    >>>
    >>> # example for if any (at least one) item contained in superset (or statement)
    ...
    >>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
    False
    >>>
    >>> sublist[0] = label
    >>>
    >>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
    True
    >>>
    >>> # example for whether a subset (all items) contained in superset (and statement)
    ...
    >>> # a bit of demorgan's law
    ...
    >>> next((False for item in sublist if item not in list), True)
    False
    >>>
    >>> sublist[1] = case
    >>>
    >>> next((False for item in sublist if item not in list), True)
    True
    >>>
    >>> next((True for item in sublist if next((True for x in list if x == item), False)), False)
    True
    >>>
    >>>
    

    【讨论】:

      【解决方案3】:

      不是 OP 的情况,但是 - 对于任何想要在 dicts 中断言交集并由于谷歌搜索不佳而最终来到这里的人(例如我) - 你需要使用 dict.items:

      >>> a = {'key': 'value'}
      >>> b = {'key': 'value', 'extra_key': 'extra_value'}
      >>> all(item in a.items() for item in b.items())
      True
      >>> all(item in b.items() for item in a.items())
      False
      

      这是因为 dict.items 返回键/值对的元组,并且与 Python 中的任何对象非常相似,它们可以互换

      【讨论】:

        【解决方案4】:

        如何使用 lambda 表达式执行此操作的示例如下:

        issublist = lambda x, y: 0 in [_ in x for _ in y]
        

        【讨论】:

        • 请添加 cmets 来解释/阐述您的答案
        【解决方案5】:

        我喜欢这两个,因为它们看起来最合乎逻辑,后者更短并且可能最快(此处使用 set 文字语法,在 Python 2.7 中使用 backported):

        all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
        #   or
        {'a', 'b'}.issubset({'a', 'b', 'c'})
        

        【讨论】:

        • 使用 timeit() 测量时,“全部”解决方案是最快的。这应该是公认的答案。
        【解决方案6】:

        如果您的列表包含这样的重复项怎么办:

        v1 = ['s', 'h', 'e', 'e', 'p']
        v2 = ['s', 's', 'h']
        

        集合不包含重复项。因此,以下行返回 True。

        set(v2).issubset(v1)
        

        要计算重复,您可以使用代码:

        v1 = sorted(v1)
        v2 = sorted(v2)
        
        
        def is_subseq(v2, v1):
            """Check whether v2 is a subsequence of v1."""
            it = iter(v1)
            return all(c in it for c in v2) 
        

        因此,以下行返回 False。

        is_subseq(v2, v1)
        

        【讨论】:

          【解决方案7】:

          像 Python 中的 &lt;= 这样的运算符通常不会被覆盖以表示与“小于或等于”明显不同的东西。标准库这样做很不寻常——对我来说它闻起来像旧 API。

          使用等效且名称更明确的方法set.issubset。请注意,您不需要将参数转换为集合;如果需要,它会为您执行此操作。

          set(['a', 'b']).issubset(['a', 'b', 'c'])
          

          【讨论】:

          • 不知道您可以将列表直接作为参数传递给 issubset ...不错!
          • 虽然我同意这种观点,但我对&lt;=issubset 的意思是相同的想法很满意。你为什么不喜欢它?
          • @Just:主要是因为&lt;= 对集合的含义并不明显,而无需在文档中查找它或事先了解它在集合论中的含义,而每个人都知道什么issubset 表示自动。
          • 您知道(非正确)子集的数学运算符吗?它基本上看起来很像一个圆形
          • 喜欢这个解决方案。有没有办法获取索引位置或列表值而不是 bool (True:False)?
          【解决方案8】:

          我可能会以下列方式使用set

          set(l).issuperset(set(['a','b'])) 
          

          或者反过来:

          set(['a','b']).issubset(set(l)) 
          

          我觉得它更具可读性,但它可能有点过头了。集合对于计算集合之间的联合/交集/差异特别有用,但在这种情况下它可能不是最佳选择...

          【讨论】:

          • 其实MySet.issubset(MyOtherSet)MySet &lt;= MyOtherSet是一样的。
          • @wok :哦,我不知道,但我认为
          • 如果您还记得包含定义了任何一组集合的偏序,那并没有那么令人困惑。 &lt;= 对序列的含义实际上有点令人困惑:人们可能会认为它的意思是“是一个子序列”,而不是字典顺序。
          • @aaronasterling : 嗯,我个人在输入代码时不会过多考虑“部分顺序” :-),但我同意将 &lt;= 与序列一起使用也感觉很奇怪的事实,不知何故...
          • 我在这里遇到了一个小问题,我想提一下:如果您使用这种方法,您正在将您的列表转换为集合,这意味着没有重复。 set(['a','a']).issubset(['a']) 返回True
          猜你喜欢
          • 1970-01-01
          • 2016-09-18
          • 2010-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-09
          相关资源
          最近更新 更多