python中的"a in b"关键字,多个a怎么办?

15 投票
7 回答
15276 浏览
提问于 2025-04-15 11:10

我在学习Python的过程中又有了新的发现,但我最喜欢的书籍又没什么声音了。Python提供了一种内置的方法,可以用'in'这个关键词来检查一个变量是否在一个可迭代的对象里:

if "a" in "abrakadabra" :
  print "it is definitely here"

但是,有没有办法检查列表里是否有多个项目(任意一个)呢?目前我在用下面的写法,但感觉有点长:

if "// @in " in sTxt or "// @out " in sTxt or "// @ret " in sTxt or <10 more>
  print "found."

当然,正则表达式可以帮忙,但用正则表达式写的代码会比较繁琐,而且不如"a in b"那么简单明了。有没有其他更Pythonic的方法呢?

7 个回答

6

如果你要检查很多行文本中是否包含相同的词,使用正则表达式来处理可能会更快。比如:

import  re
words = ["// @in ", "// @out ", "// @ret "] + ["// @test%s " % i for i in range(10)]

my_regex = re.compile("|".join(map(re.escape, words)))

for line in lines_to_search:
    if my_regex.search(line):  print "Found match"

一些快速的时间测试显示,这种方法通常比 any(word in theString for word in words) 的方式要快。我用不同的文本(有短有长,有匹配的和没有匹配的)测试了这两种方法。以下是结果:

         { No keywords  } |  {contain Keywords }
         short    long       short    long
regex  : 0.214    27.214     0.147    0.149
any in : 0.579    81.341     0.295    0.300

不过,如果性能不是很重要的话,使用 any() 的方法会更容易理解。

7

这段代码的意思是:检查在一个叫做 text_body 的文本里,是否包含了“hi”、“foo”、“bar”或者“spam”这几个词中的任何一个。

具体来说,any() 是一个函数,它会查看里面的内容,只要有一个是对的,它就会返回“真”。这里的内容是一个循环,逐个检查 text_body 里有没有“hi”、“foo”、“bar”或者“spam”。如果找到了其中任何一个词,整个表达式就会返回“真”。如果一个都没有找到,那就返回“假”。

46
alternatives = ("// @in ", "// @out ", "// @ret ")
if any(a in sTxT for a in alternatives):
    print "found"

if all(a in sTxT for a in alternatives):
   print "found all"

any()all() 是两个函数,它们可以用来处理一系列的东西(我们称之为可迭代对象)。any() 会检查这些东西中有没有至少一个是“真”的,而 all() 则会检查这些东西是否全部都是“真”的。如果把这两个函数和生成器表达式结合起来使用,你就可以同时检查多个项目了。

撰写回答