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

我发现,有一个相关的问题,关于如何找到一个列表中是否至少有一个条目存在:
如何检查列表中是否有下列项目之一?

但是,查找列表中是否存在所有项的最佳和 Python 方法是什么呢?

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

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

但在这里,您必须做更多的打字工作。

还有别的办法吗?

194298 次浏览

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

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

或者正好相反:

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

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

在 Python 中,像 <=这样的运算符通常不会被覆盖以表示与“小于或等于”有显著不同的意思。标准库这样做很不寻常——对我来说,它闻起来像是遗留的 API。

使用等效的、命名更清晰的方法 set.issubset。请注意,您不需要将参数转换为一个集合; 如果需要,它将为您执行此操作。

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

我喜欢这两个,因为它们看起来最符合逻辑,后者更短,可能更快(这里使用的是从 背靠背到 Python 2.7的 set文字语法) :

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

如果您的列表包含如下重复内容,该怎么办:

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)

这就是我在网上搜索的内容,可惜没有在网上找到,而是在实验 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
>>>
>>>

如何使用 lambda 表达式实现这一点的一个例子是:

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

这不是 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

这是因为 dict.items返回键/值对的元组,而且就像 Python 中的任何对象一样,它们可以互换

另一个解决办法是:

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

我的解决方案之所以伟大,是因为您可以通过将列表内联来编写一行程序。