2011-08-19 26 views
0

好的,這是我的問題,我定義了一個函數來計算某個字符串中某個片段出現的次數。該函數在索引[0]處開始搜索,隨後的搜索從字符串中最後匹配的索引處開始。用戶在Python中定義函數的問題

下面的代碼

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.. 

只是尋找一些幫助和輸入..

感謝

回答

1

你有兩個錯誤:

  1. 是找到將返回-1如果找不到該片段
  2. 的last_match返回比賽開始的索引,所以如果你的字符串文檔狀態再次從該索引搜索,您會一次又一次找到相同的匹配項。

所以,你可能必須要使用此:

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(片段),如果你不感興趣的重疊比賽...或正則表達式由以前的答案是mentionned ...

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

你有沒有考慮使用正則表達式?它非常適合您的使用。 Python re module

更新:爲了擴大關,如果你做這樣的事......

進口重新

...

高清countOccurrences(myFragment,MyString的): EXPR =重.compile(myFragment) 回報LEN(expr.findall(MyString的))

+0

無不是真的,我覺得有這個問題的解決方案,而無需使用稀土的..我只是累想一想.. ;-)也許我會讓它休息一下,重新回到2毫米,並保持清新的頭腦。 – CPerez721

+0

我認爲Achim的球數統計方法是正確的。爲了存檔,我會在這裏留下我的文章。 – 2011-08-19 06:07:28

4

你應該利用現有的功能,如果可能的話:

"aabbccaabb".count("aa") 

count方法確實如你所願。上面的例子返回2

+0

您的權利,沒有必要重新發明輪子.. ;-) – CPerez721

0

從邏輯上講,你的問題是,你只是一遍又一遍地尋找同一場比賽:

last_match = string.find(fragment, last_match) 

...從哪裏找到的最後一場比賽開始,這隻會給你同樣的位置回來!您需要使用string.find(fragment, last_match + 1),這將需要您跳過箍環才能使用標記,初始值爲last_match

Achim's answer答案是現貨:你應該使用現有的功能來做到這一點。

+0

你絕對正確Detly,這就是爲什麼我說,當我修復無限循環這一切都很好,很正常,直到作爲參數傳遞的片段指數開始[0]在字符串.. – CPerez721