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

sir*_*rex 97 python list inclusion

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

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

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

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False
Run Code Online (Sandbox Code Playgroud)

其他解决方案是:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False
Run Code Online (Sandbox Code Playgroud)

但在这里你必须做更多的打字.

还有其他解决方案吗?

Gle*_*ard 125

<=Python中的运算符通常不会覆盖与"小于或等于"明显不同的含义.标准库执行此操作是不寻常的 - 它闻起来像遗留API.

使用等效且更清楚命名的方法set.issubset.请注意,您不需要将参数转换为集合; 如果需要,它会为你做的.

set(['a', 'b']).issubset(['a', 'b', 'c'])
Run Code Online (Sandbox Code Playgroud)

  • 虽然我同意这种观点,但我对“&lt;=”和“issubset”含义相同的想法非常满意。你为什么不喜欢它? (4认同)
  • 不知道你可以直接将列表作为参数传递给issubset ......真好! (2认同)
  • @Just:首先,因为对于一个集合没有在文档中查找或事先知道它在集合论中意味着什么而对`<=`意味着什么并不明显,而每个人都知道`issubset`意味着什么. (2认同)
  • 您知道(非正确)子集的数学运算符吗?它基本上看起来很像一个舍入的&lt;=;) (2认同)

tsi*_*lar 60

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

set(l).issuperset(set(['a','b'])) 
Run Code Online (Sandbox Code Playgroud)

或者反过来说:

set(['a','b']).issubset(set(l)) 
Run Code Online (Sandbox Code Playgroud)

我发现它更具可读性,但可能会过度杀戮.集合对于计算集合之间的并集/交集/差异特别有用,但在这种情况下它可能不是最佳选择...

  • 如果你记得包含在任何一组集上定义了一个部分顺序,那就不是那么令人困惑了.实际上有点令人困惑的是,"<=`具有它对序列的意义:人们可能期望它意味着'是一个子序列'而不是词典排序. (3认同)
  • 我在这里碰到了一个小问题我想提一下:如果你使用这种方法,你*将*列表转换为集合,这意味着没有重复.`set(['a','a']).issubset(['a'])`返回`True`. (3认同)
  • @aaronasterling:嗯,当我输入代码时,我个人并没有过多考虑“偏序”:-),但我同意这样一个事实,即在序列中使用 `&lt;=` 也感觉很奇怪,不知何故...... (2认同)

mar*_*eau 11

我喜欢这两个,因为它们看起来最合乎逻辑,后者更短,可能更快(这里使用set文字语法显示已经 向后移植到Python 2.7):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})
Run Code Online (Sandbox Code Playgroud)


Bru*_*rut 7

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

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']
Run Code Online (Sandbox Code Playgroud)

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

set(v2).issubset(v1)
Run Code Online (Sandbox Code Playgroud)

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

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) 
Run Code Online (Sandbox Code Playgroud)

因此,以下行返回 False。

is_subseq(v2, v1)
Run Code Online (Sandbox Code Playgroud)