ere*_*eOn 22 python conditional
我自己找不到任何"好"答案的简单问题:
假设我有以下条件:
if 'foo' in mystring or 'bar' in mystring or 'hello' in mystring:
# Do something
pass
Run Code Online (Sandbox Code Playgroud)
or根据情况,声明的数量可以更长.
在不牺牲性能的情况下,是否有一种"更好"(更多Pythonic)的写法方式?
如果考虑使用,any()但它需要一个类似布尔元素的列表,所以我必须首先构建该列表(在此过程中放弃短路评估),所以我猜它效率较低.
非常感谢你.
glg*_*lgl 30
一种方式可能是
if any(s in mystring for s in ('foo', 'bar', 'hello')):
pass
Run Code Online (Sandbox Code Playgroud)
你迭代的东西是一个元组,它是在编译函数的基础上构建的,所以它不应该低于原始版本.
如果你担心元组会变得太长,你可以做到
def mystringlist():
yield 'foo'
yield 'bar'
yield 'hello'
if any(s in mystring for s in mystringlist()):
pass
Run Code Online (Sandbox Code Playgroud)
这听起来像是一个正则表达式的工作.
import re
if re.search("(foo|bar|hello)", mystring):
# Do something
pass
Run Code Online (Sandbox Code Playgroud)
它也应该更快.特别是如果你提前编译正则表达式.
如果您正在自动生成正则表达式,则可以使用re.escape()以确保没有特殊字符会破坏正则表达式.例如,如果words是您要搜索的字符串列表,则可以生成如下所示的模式:
pattern = "(%s)" % ("|".join(re.escape(word) for word in words), )
Run Code Online (Sandbox Code Playgroud)
您还应该注意,如果您有m单词并且您的字符串包含n字符,则原始代码具有O(n*m)复杂性,而正则表达式具有O(n)复杂性.即使Python正则表达式不是真正的理论comp-sci正则表达式,并且并不总是 O(n)复杂性,在这个简单的情况下它们是.
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |