8

可能重复:
Python 检查以下所有项目是否都在列表中

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

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

4 回答 4

9

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

words = {"the", "set", "of", "words"}
if words <= set_of_words:
   do_stuff()
于 2012-09-04T21:28:06.450 回答
8

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

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"])):
     ...
于 2012-09-04T21:20:45.257 回答
2

你可以这样做:

if all(current_word in lst for current_word in (word, word1)):
  do x
于 2012-09-04T21:24:44.177 回答
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
于 2012-09-04T21:44:35.197 回答