【问题标题】:counting the number of substrings in a string计算字符串中子字符串的数量
【发布时间】:2017-10-20 08:06:25
【问题描述】:

我正在做一个 Python 作业,但我被困在这里。

显然,我必须编写一个代码来计算字符串中给定子字符串的数量。

我以为我做对了,然后我就卡在这里了。

def count(substr,theStr):
    # your code here
    num = 0
    i = 0
    while substr in theStr[i:]:
        i = i + theStr.find(substr)+1
        num = num + 1

    return num

substr = 'is'
theStr = 'mississipi'
print(count(substr,theStr))

如果我运行它,我希望得到 2 作为结果,而不是得到 3...

请看,anabanana 等其他示例可以正常工作,但这个特定示例不断出错。我不知道我在这里做错了什么。

请你帮帮我。

【问题讨论】:

    标签: python string loops error-handling while-loop


    【解决方案1】:

    在您的代码中

    while substr in theStr[i:]:
    

    正确地越过目标字符串theStr,但是

    i = i + theStr.find(substr)+1
    

    theStr的开头继续查找。

    str.find 方法接受可选的 startend 参数来限制搜索:

    str.find(sub[, start[, end]])

    返回字符串中找到子字符串 sub 的最低索引 在切片s[start:end] 内。可选参数 startend 被解释为切片符号。如果未找到 sub,则返回 -1。

    我们实际上不需要在这里使用in:我们可以检查find 不返回-1。当我们需要使用find 重复搜索以获取子字符串的索引时,执行in 搜索有点浪费。

    我假设您想要找到重叠匹配,因为str.count 方法可以找到非重叠匹配,并且由于它是在 C 中实现的,它比在 Python 中实现它更有效。

    def count(substr, theStr):
        num = i = 0
        while True:
            j = theStr.find(substr, i)
            if j == -1:
                break
            num += 1
            i = j + 1
        return num
    
    print(count('is', 'mississipi'))
    print(count('ana', 'bananana'))
    

    输出

    2
    3
    

    这段代码的核心是

    j = theStr.find(substr, i)
    

    i 被初始化为 0,所以我们从 theStr 的开头开始搜索,并且由于 i = j + 1 后续搜索从最后找到的匹配项之后的索引开始查找。

    【讨论】:

      【解决方案2】:

      您需要的代码更改是 -

      i = i + theStr[i:].find(substr)+ 1
      

      而不是

      i = i + theStr.find(substr)+ 1
      

      在您的代码中,始终可以找到子字符串,直到 i 到达位置 4 或更多。但是在查找子字符串的索引时,您使用的是原始(整个)字符串,该字符串又将位置返回为 1。

      在您的banana 示例中,在第一次迭代后i 变为2。因此,在下一次迭代中str[i:] 变为nana。并且子字符串ana在这个切片字符串中的位置和原始字符串是1。所以,代码中的错误被抑制了,代码似乎工作正常。

      如果您的代码纯粹用于学习目的,您可以这样做。否则你可能想利用 python 提供的函数(如count())来完成这项工作。

      【讨论】:

        【解决方案3】:

        计算子串的个数:

        def count(substr,theStr):
            num = 0
            for i in range(len(theStr)):
                if theStr[i:i+len(substr)] == substr:
                    num += 1
            return num
        
        substr = 'is'
        theStr = 'mississipi'
        print(count(substr,theStr))
        

        O/P : 2

        其中theStr[i:i+len(substr)] 是切片字符串,i 是分层索引,i+len(substr) 是结束索引。

        例如。

        i = 0

        substr 长度 = 2

        第一次比较子串是 => mi

        String slice more details

        【讨论】:

        • 来自审核队列:我可以请求您在您的答案周围添加更多上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
        • SO 社区将通过使用 upvote 或 downvote 来做到这一点。见Why is voting important?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2016-05-24
        • 2023-03-28
        • 1970-01-01
        • 2021-01-24
        • 2018-07-23
        相关资源
        最近更新 更多