本文介绍了使用 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

程序运行过程:

  1. 初始化计数器 count 为 0,设置初始索引 index 为 0。
  2. 循环遍历字符串 s,从索引 index 开始查找子串 sub 第一次出现的位置,使用 s.find(sub, index) 方法,返回子串在 s 中的位置,如果找到则返回位置,没有找到则返回 -1。
  3. 判断查找结果,如果返回 -1,表示没有找到,跳出循环。否则,找到了子串,计数器 count 加 1,同时更新索引 index 为子串的下一个位置,即 index += 1
  4. 继续循环查找子串,直到找不到为止。
  5. 返回计数器 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

修改后的代码添加了两个特殊情况的处理:

  1. 如果子串出现在字符串 s 的首位置,需要更新索引 index 为 1,避免重复计算。
  2. 如果子串出现在字符串 s 的尾位置,需要单独计算,因为 s.find() 方法只会返回子串第一次出现的位置,不会返回最后一次出现的位置。可以使用 s.endswith(sub) 方法判断子串是否出现在字符串 s 的尾位置,如果是,则计数器 count 加 1。

总结:

修改后的代码可以正确统计子串出现次数,包括出现在首尾位置的情况。

Python 使用 s.find() 循环遍历统计子串出现次数,并解决首尾位置统计错误问题

原文地址: https://www.cveoy.top/t/topic/nqLF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录