我在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方法吗?
答案 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彼得森表现得更容易。