python,“a in b”关键字,多个a的怎么样?

时间:2009-04-18 18:53:11

标签: python

我在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 个答案:

答案 0 :(得分: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()采用可迭代的方式检查其中是否有任何/所有值都为真值。将它与生成器表达式相结合,您可以检查多个项目。

答案 1 :(得分:7)

any(snippet in text_body for snippet in ("hi", "foo", "bar", "spam"))

答案 2 :(得分: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()方法更具可读性。

答案 3 :(得分:1)

如果您想要任何检查,那么您可以使用:

inthere = False
checks = ('a', 'b')

for check in checks:
    if check in 'abrakadabra':
        inthere = True
        break

如果你想要所有结帐,你可以使用:

inthere = True
checks = ('a', 'b')

for check in checks:
    if check not in 'abrakadabra':
        inthere = False
        break

编辑:不知道更多的pythonic any()。在python上使用它可能更好。

EDIT2:添加了break语句,并更正了 all -case。

答案 4 :(得分:1)

您也可以使用set methods and operators

not alternatives.isdisjoint(sTxt)  # for "any"
(alternatives & sTxt) != set()  # Again, the intersection is nonempty
alternatives <= sTxt  # for "all"

我认为这些比使用any或all更容易阅读,但必须将您的集合转换为集合。由于交叉和遏制是你关心的,你可以考虑首先设置它们。

答案 5 :(得分:1)

这必须是旧帖子,现在最简单的方法是使用列表:

a = "some long text which may or may not include bononos or cabbages"
alternatives = ["apple", "banana", "riverdale"]
if a in alternatives:
    print("Hm?")

答案 6 :(得分:0)

语法中没有内置方法可以做到这一点。但是你可以使用'any'功能让@MizardX和@Benjamin彼得森表现得更容易。