使用一个“in”语句(Python)测试多个对象是不是在列表中[重复]
Posted
技术标签:
【中文标题】使用一个“in”语句(Python)测试多个对象是不是在列表中[重复]【英文标题】:Testing if multiple objects are in a list using one "in" statement (Python) [duplicate]使用一个“in”语句(Python)测试多个对象是否在列表中[重复] 【发布时间】:2012-08-29 14:02:41 【问题描述】:可能重复:Python Check if all of the following items is in a list
所以我想测试一下 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
编辑:谢谢你的回答,我想我现在对如何做到这一点有了一个很好的想法。
【问题讨论】:
试试set(lst).issubset([word, word1])
***.com/questions/3931541/…
【参考方案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
【讨论】:
【参考方案2】:答案是正确的(至少其中一个是正确的)。但是,如果您正在执行包含检查并且不关心顺序,就像您的示例可能暗示的那样,那么真正的答案是您应该使用集合并检查子集。
words = "the", "set", "of", "words"
if words <= set_of_words:
do_stuff()
【讨论】:
【参考方案3】:你可以这样做:
if all(current_word in lst for current_word in (word, word1)):
do x
【讨论】:
【参考方案4】:列出您的单词和生成器表达式,检查它们是否在列表中:
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"])):
...
【讨论】:
在这两个示例中都有一组额外的括号。作为可调用对象的唯一参数的基因表达式可以写成all(foo for foo in thing)
。
我知道,但我更喜欢将它们明确地写在括号内。这使得更容易看到那里有一个可迭代的并有助于重构......额外的括号使用 vim 派上用场:)以上是关于使用一个“in”语句(Python)测试多个对象是不是在列表中[重复]的主要内容,如果未能解决你的问题,请参考以下文章