使用一个“in”语句测试多个对象是否在列表中(Python)

时间:2012-09-04 21:16:49

标签: python python-3.x conditional-operator

  

可能重复:
  Python Check if all of the following items is in a list

所以我想测试word和word1是否都在列表中。 当然,我可以写:

if word in lst and word1 in lst:
    do x

但我想知道我是否可以将该陈述缩短为:

if (word and word1) in lst:
    do x

当然,这不起作用,但是会有什么有效的相似之处吗?

我尝试了以下操作,但正如您所看到的,它不会产生预期的结果。

>>> word in lst
True
>>> word1 in lst
True
>>> (word, word1) in lst
False

编辑:感谢您的回答,我想我现在已经非常了解如何做到这一点。

4 个答案:

答案 0 :(得分:9)

答案是正确的(至少其中一个是)。但是,如果您正在进行遏制检查并且不关心订单,就像您的示例可能建议的那样,真正的答案是您应该使用集合并检查子集。

words = {"the", "set", "of", "words"}
if words <= set_of_words:
   do_stuff()

答案 1 :(得分:7)

列出您的单词和生成器表达式,检查它们是否在列表中:

words = ["word1", "word2", "etc"]
lst = [...]
if all((w in lst for w in words)):
    #do something

all检查迭代中的所有值是否都为真。因为我们使用发电机,所以它仍然是短路优化的。当然,如果单词列表不是太大,你可以内联单词列表:

if all((w in lst for w in ["word1", "word2", "etc"])):
     ...

答案 2 :(得分:2)

你可以这样做:

if all(current_word in lst for current_word in (word, word1)):
  do x

答案 3 :(得分:1)

注意:不要使用它。这里只是为了说明python的“又一个”功能。

效率较低的解决方案:

>>> from itertools import permutations
>>> lis=[0,1,2,3,4]
>>> (1,2) in (z for z in permutations(lis,2)) #loop stops as soon as permutations(lis,2) yields (1,2)
True
>>> (1,6) in (z for z in permutations(lis,2))
False
>>> (4,2) in (z for z in permutations(lis,2))
True
>>> (0,5) in (z for z in permutations(lis,2))
False
>>> (0,4,1) in (z for z in permutations(lis,3))
True
>>> (0,4,5) in (z for z in permutations(lis,3))
False