如何检查列表中是否包含所有以下项?
我发现有一个相关的问题,关于如何检查一个列表中是否至少有一个项目存在:
如何检查以下项目是否在列表中?
但是,最好的、符合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
不过这样你需要输入更多的内容。
还有其他的解决方案吗?
8 个回答
25
我喜欢这两种方法,因为它们看起来最合理。后面那种方法更简短,可能也更快(这里用的是 set
字面量语法,这种语法已经被 移植 到 Python 2.7 里):
all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
# or
{'a', 'b'}.issubset({'a', 'b', 'c'})
73
我可能会这样使用set
:
set(l).issuperset(set(['a','b']))
或者反过来这样用:
set(['a','b']).issubset(set(l))
我觉得这样写更容易理解,但可能有点过于复杂。集合特别适合用来计算多个集合之间的并集、交集和差集,但在这种情况下,可能不是最好的选择……
295
在Python中,像 <=
这样的运算符通常不会被重新定义为与“小于或等于”有很大不同的意思。标准库里很少这样做——我觉得这有点像是老旧的接口。
建议使用更清晰命名的等效方法 set.issubset
。注意,你不需要把参数转换成集合;如果需要,它会自动帮你处理。
set(['a', 'b']).issubset(['a', 'b', 'c'])