查看List是否只有某些值

时间:2015-01-14 02:50:32

标签: python

给出一个清单:

x = [1,2,1,1,1,2,1]

是否有单行查看列表是否包含指定值而没有其他内容?例如:

x([1,2]) = True
x([1,]) = False
x([1,2,3]) = False

3 个答案:

答案 0 :(得分:5)

在其他问题中提出的set的替代方案,在某些情况下失败可能会更快:

all(y in (1, 2) for y in x)

它有时会更快,因为all"快速失败" - 一旦找到一个错误的项目,它就会挽救(不会保持循环)。

至于速度,

$ python -mtimeit -s'x=[1,2,1,1,1,2,1];check=(1,2)' 'all(y in check for y in x)'
1000000 loops, best of 3: 1.03 usec per loop
$ python -mtimeit -s'x=[1,2,1,1,1,2,1];check=set((1,2))' 'all(y in check for y in x)'
1000000 loops, best of 3: 1.01 usec per loop

(时间差"噪音")。建议对其他答案使用集合,如果两个原始版本中存在的杀手bug都是固定的,确实更快:

$ python -mtimeit -s'x=[1,2,1,1,1,2,1];check=set((1,2))' 'set(x)<=check'
1000000 loops, best of 3: 0.425 usec per loop

杀手级错误是所述原始版本,对于这两个答案(现已在编辑中更正),使用==而不是<= - 因此他们检查了x的项目是与check完全相同,而不是满足您的规范需要,是子集True需要x的一个示例和[1,2,3],这两个原始版本都会在那里失败。

答案 1 :(得分:3)

您可以查看是否{例} set(x) <= set([1, 2])。 (您可以在Python 2.7及更高版本中使用{1, 2} set([1, 2])。)

答案 2 :(得分:2)

看起来你想看看列表中的元素是否来自某个集合。如果是这种情况,您可以转换为一个集合并使用issubset

>>> x = set([1,2,1,1,1,2,1])
>>> x.issubset([1,2])
True
>>> x.issubset([1])
False
>>> x.issubset([1,2,3])
True