3 回答
TA贡献1795条经验 获得超7个赞
您可以尝试这样的事情:
In [1]: m = 'college'
In [2]: s = 'col'
In [3]: if any(m[i:i+len(s)] == s for i in range(len(m)-len(s)+1)):
...: print 'Present'
...: else:
...: print 'Not present'
...:
Present
在这里any检查每个m长度的子字符串,len(s)看看是否相等s。如果是这样,它将返回True并停止进一步的处理(这称为“短路”,与break您上面的操作非常相似)。
any如果我们将其替换为列表理解并进行相等比较,则该部分的外观如下:
In [4]: [m[i:i+len(s)] for i in range(len(m)-len(s)+1)]
Out[4]: ['col', 'oll', 'lle', 'leg', 'ege']
TA贡献2041条经验 获得超4个赞
您的代码是快速实现常规子字符串搜索的合法方法,但不是唯一的方法。更高效的算法包括Boyer-Moore字符串搜索,Knuth-Morris-Pratt搜索或使用DFA实现的搜索。
这是一个很大的话题,您的问题并不清楚您实际上要获得什么样的信息。对于Python,当然,最简单in
的方法是简单地使用运算符和相关方法,str.find
并且str.index
所有这些方法都部署了简化的Boyer-Moore。
TA贡献1831条经验 获得超9个赞
您不需要global那里。另外,你可以
In [1]: %paste
m = "college"
s = "col"
In [2]: 'not ' * all(s != m[i:i+len(s)] for i in range(1+len(m)-len(s))) + 'present'
Out[2]: 'present'
但实际上您当然应该这样做s in m,
添加回答
举报