【问题标题】:How to count how many time a sequence appears in a give string in python?如何计算一个序列在python中的给定字符串中出现的次数?
【发布时间】:2019-03-12 10:10:53
【问题描述】:

我正在尝试计算一个序列在给定字符串中出现的次数。

def count_seqence(str, seq):
    count = 0
    if seq in str:
        count += 1
    return count
print(count_seqence("the quick brown fox jumps over the lazy dog","he"))

但这只运行一次并且不循环,我如何循环并计算出现的次数,因为我知道循环将针对每个字符而不是序列,这让我感到困惑。

【问题讨论】:

  • mystr.count('he')?

标签: python python-3.x string iteration sequence


【解决方案1】:

好吧,既然您使用if,而不是在循环中,这意味着条件是True,因此您递增count,或者它是False,在这种情况下您不执行身体。

如果你想计算数字,你需要一些“循环”机制。这不必是明确的,例如in 也隐藏了一个循环。但这只会导致TrueFalse

不重叠(count_seqence('aaaa', 'aa')2

对于不重叠的计数,我们可以使用str.count

def count_seqence(text, seq):
    return text.count(seq)

在这种情况下,定义一个特定的功能当然是没有用的。请注意,以上将仅计算 非重叠 匹配项。例如,当您在 'aaaa' 中计算 'aa' 时,您将得到 2,而不是 3

重叠(count_seqence('aaaa', 'aa')3

对于重叠,我们需要执行str.find,并更新“搜索窗口”,直到我们不再找到匹配项,例如:

def count_seqence(text, seq):
    cnt = 0
    idx = text.find(seq)
    while idx >= 0:
        cnt += 1
        idx = text.find(seq, idx+1)
    return cnt

因此,我们有一个 idx 来存储发生新匹配的索引,并且每次 idx 大于或等于 0(我们找到匹配)时,我们递增 cnt,并更改idx下一个匹配。

【讨论】:

    【解决方案2】:

    在您的字符串上使用count,它将返回找到您的参数值seq的次数

    def count_seqence(str, seq):
        return str.count(seq)
    
    print count_seqence("kjdsflsdnf lskmfldsknffsdlkfnsldkmf", "ds")
    

    输出

    2
    

    【讨论】:

    • 这很尴尬,只有一行,我有三个小时,尝试使用 if 和 elif 语句,谢谢哥们
    • 另一个答案更完整,包括序列重叠的情况。
    • @JonathanGagne:你能提供这个约定的参考吗?此外,一些复杂的解决方案往往更有效。例如,计算重叠实例的切片解决方案确实很容易理解,但会缩放 O(mn),而 Knuth-Morris-Pratt 算法更难理解,但会缩放 O(m + n).
    • @JonathanGagne:关于重叠计数的问题具体在哪里? :)
    • 但是是的,我想要更多,因为现在,您仍然没有分享规范的答案。不知何故,您不仅给出了 pars-pro-to 答案,还给出了 pars-pro-toto 链接 :) 也许我应该更具体一些,您能否提供一个 canonical 链接来指定最短的答案是最好的?
    【解决方案3】:

    使用string.count 方法。检查Python documentation

    例子:

    x = "wip wip I'm a sheep wip"
    print(x.count("wip"))
    

    【讨论】:

      【解决方案4】:

      对你的字符串使用count,它会返回找到你的参数值seq的次数

      def count_seqence(str, seq): 返回 str.count(seq)

      打印 count_seqence("kjdsflsdnf

      【讨论】:

        猜你喜欢
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多