Python 使用 s.find() 循环遍历统计子串出现次数,并解决首尾位置统计错误问题
本文介绍了使用 Python 中的 s.find() 方法循环遍历字符串,统计给定子串出现次数的代码实现。
代码示例:
def count_substring(s, sub):
count = 0
index = 0
while index < len(s):
index = s.find(sub, index)
if index == -1:
break
else:
count += 1
index += 1
return count
程序运行过程:
- 初始化计数器
count为 0,设置初始索引index为 0。 - 循环遍历字符串
s,从索引index开始查找子串sub第一次出现的位置,使用s.find(sub, index)方法,返回子串在s中的位置,如果找到则返回位置,没有找到则返回 -1。 - 判断查找结果,如果返回 -1,表示没有找到,跳出循环。否则,找到了子串,计数器
count加 1,同时更新索引index为子串的下一个位置,即index += 1。 - 继续循环查找子串,直到找不到为止。
- 返回计数器
count的值,即子串在s中出现的次数。
问题:
如果子串出现在字符串 s 的首尾位置,程序统计次数会少。因为 s.find() 方法只会返回子串第一次出现的位置,如果子串出现在首尾位置,只会被计算一次。例如,对于字符串 s='abcdabcda' 和子串 sub='a',使用上述代码统计子串出现次数,结果为 2,但实际上子串出现了 3 次。
解决方案:
为了解决这个问题,需要对代码进行修改,添加特殊情况的处理,如下:
def count_substring(s, sub):
count = 0
index = 0
while index < len(s):
index = s.find(sub, index)
if index == -1:
break
else:
count += 1
if index == 0:
index = 1
else:
index += 1
if s.endswith(sub):
count += 1
return count
修改后的代码添加了两个特殊情况的处理:
- 如果子串出现在字符串
s的首位置,需要更新索引index为 1,避免重复计算。 - 如果子串出现在字符串
s的尾位置,需要单独计算,因为s.find()方法只会返回子串第一次出现的位置,不会返回最后一次出现的位置。可以使用s.endswith(sub)方法判断子串是否出现在字符串s的尾位置,如果是,则计数器count加 1。
总结:
修改后的代码可以正确统计子串出现次数,包括出现在首尾位置的情况。
原文地址: https://www.cveoy.top/t/topic/nqLF 著作权归作者所有。请勿转载和采集!