2 回答
TA贡献1799条经验 获得超8个赞
通过循环使用:
for i in sq:
您正在遍历.sq
相反,如果您希望变量i遍历 的可能索引,sq您通常会遍历range(len(sq)),以便从0到获取值len(sq) - 1。
for i in range(len(sq)):
但是,在这种情况下,您想要分配给i循环内部:
i += len(STR)
如果您正在循环,这将不会产生预期的效果,range(...)因为在下一次迭代中它将被分配给来自 的下一个值range,忽略添加的增量。通常,不应在循环内分配给循环变量。
因此,它可能最容易通过循环实现,并且您显式while设置所需的值(在重新启动循环之前进行初始化),然后您可以在循环内进行任何其他赋值。ii=0i+=1
STR = "ell"
sq = "well, well, hello world"
counter = 0
i = 0
while i < len(sq):
while sq[i:i+len(STR)] == STR: # re use of while here, see comments
counter += 1
i += len(STR)
i += 1
print(counter) # prints 3
(您也许可以保存len(sq)并保存len(STR)在其他变量中以保存重复评估它们。)
TA贡献1772条经验 获得超8个赞
此解决方案不使用 afor因此增量可以在不匹配时增加一个,在匹配时增加字符串长度。任何不匹配记录到目前为止看到的最大计数并重置计数。
def count_max(string,key):
if len(key) > len(string):
return 0
last = len(string) - len(key)
i = 0
count = 0
maximum = 0
while i <= last:
if string[i:i+len(key)] == key:
count += 1
i += len(key)
else:
maximum = max(maximum,count)
count = 0
i += 1
return max(maximum,count)
key = 'abc'
strings = 'ab','abc','ababcabc','abcdefabcabc','abcabcdefabc'
for string in strings:
print(count_max(string,key))
输出:
0
1
2
2
2
这里还有一个可能更快的版本。对于短字符串,它并不快,但如果字符串很长,它会快得多,因为正则表达式会比 Python 循环更快地找到匹配项。
def count_max2(string,key):
return max([len(match) // len(key)
for match in re.findall(rf'(?:{re.escape(key)})+',string)]
,default=0)
怎么运行的:
re.escape
是一个确保字符按key
字面意义而不是正则表达式语法的函数。例如,允许搜索+
,而不是被视为“一个或多个”匹配项。rf''
是原始f 字符串(格式字符串)的语法。建议对正则表达式使用“raw”,因为表达式的某些语法会与其他 Python 语法混淆。f-strings 允许使用大括号将变量和函数插入到字符串中{}
。re.findall
查找字符串中的所有连续匹配项。[f(x) for x in iterable]
是一个列表推导式,获取从 iterable 返回的列表,并计算列表中每个项目的函数。在这种情况下,如果用匹配的长度除以键的长度来得到键的出现次数。max(iterable,default=0)
返回 iterable 的最大值,如果 iterable 为空(无匹配项)则返回 0。
添加回答
举报