用户在Python中定义函数的问题

时间:2011-08-19 05:47:49

标签: python function

好的,这是我的问题,我定义了一个函数,它假设计算某个字符串中出现某个片段的次数。该函数开始在Index [0]处搜索,随后的搜索从字符串中最后一个匹配的索引开始。

这是代码

def function(fragment, string):
    count = -1
    last_match = 0
    while last_match != -1:
        count += 1
        last_match = string.find(fragment, last_match)
    return count

现在问题是,当将参数传递给函数时,片段显然是字符串中的匹配,我得到一个无限循环。 当我修复无限循环时,如果位于Index [0]的传递片段函数没有返回正确的计数???

例如:
   function('gtg' , 'gttacgtggatg' ) This gives me an infinite loop

function('gtt' , 'gttacgtggatg' ) This doesn't return a count..

只是寻求帮助和输入..

由于

4 个答案:

答案 0 :(得分:4)

如果可能,您应该使用现有功能:

"aabbccaabb".count("aa")

count方法完全符合您的要求。上面的例子返回2。

答案 1 :(得分:1)

你有两个错误:

  1. 字符串文档声明如果找不到片段,find将返回 -1
  2. last_match返回匹配开头的索引,因此如果您再次从该索引中搜索,您将一次又一次地找到相同的匹配。
  3. 所以你可能不得不使用它:

    def function(fragment, string):
        count = -1
        last_match = 0
        while last_match != -1:
            count += 1
            last_match = string.find(fragment, last_match)
            if last_match != -1:
                last_match += 1
        return count
    
    >>> function('gtt' , 'gttacgtggatg' )
    1
    >>> function('gtg' , 'gttacgtggatg' )
    1
    

    当然你也可以依赖string.count(片段),如果你对重叠匹配不感兴趣......或者正如以前的答案所提到的正则表达式......

    >>> 'gttacgtggatg'.count('ctt')
    0
    >>> 'gttacgtggatg'.count('gtt')
    1
    

答案 2 :(得分:0)

你考虑过使用正则表达式吗?它非常适合您的使用。 Python re module

更新:要扩展它,如果你做这样的事情......

导入重新

...

def countOccurrences(myFragment,myString):   expr = re.compile(myFragment)   return len(expr.findall(myString))

答案 3 :(得分:0)

从逻辑上讲,你的问题是你只是一遍又一遍地找到同一场比赛:

last_match = string.find(fragment, last_match)

...将从你找到最后一场比赛的地方开始,这将只是给你相同的位置!您需要使用string.find(fragment, last_match + 1),这将要求您跳过箍以使用哨兵作为初始值last_match

Achim's answer回答是:您应该使用现有功能来执行此操作。