代码之家  ›  专栏  ›  技术社区  ›  sirex

如何检查以下所有项目是否都在列表中?

  •  86
  • sirex  · 技术社区  · 15 年前

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

    但是,怎样才能找到列表中是否存在所有项呢?

    >>> 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
    

    但在这里你必须多打字。

    6 回复  |  直到 9 年前
        1
  •  138
  •   Glenn Maynard    15 年前

    类似于 <= 在Python中,通常不会重写为表示与“小于或等于”明显不同的内容。标准库这样做是不寻常的——对我来说,它闻起来像是遗留的API。

    set.issubset . 请注意,您不需要将参数转换为集合;如果需要,它将为您这样做。

    set(['a', 'b']).issubset(['a', 'b', 'c'])
    
        2
  •  61
  •   tsimbalar    15 年前

    我可能会用 set 以如下方式:

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

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

        3
  •  11
  •   martineau    7 年前

    我喜欢这两个,因为它们看起来最符合逻辑,后者更短,可能更快(这里用 set backported 到Python2.7):

    all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
    #   or
    {'a', 'b'}.issubset({'a', 'b', 'c'})
    
        4
  •  3
  •   Max    8 年前

    如果您的列表包含如下重复项:

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

    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) 
    

    is_subseq(v2, v1)
    
        5
  •  1
  •   Emirhan Özlen    7 年前

    这就是我在网上搜索的内容,但不幸的是,在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
    >>>
    >>>
    
        6
  •  0
  •   heckj    7 年前

    issublist = lambda x, y: 0 in [_ in x for _ in y]
    
        7
  •  0
  •   Julio Cezar Silva    6 年前

    不是OP的情况,但是-对于任何想要在 最后因为谷歌搜索不好(比如我)而来到这里-你需要和 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
    

    那是因为 听写项目 返回键/值对的元组,与Python中的任何对象一样,它们可以互换比较