2013-10-30 78 views
0

如果我使用替代字符串和子字符串,此代碼似乎工作,但只要一個字母在連續兩次出現此函數flipsout,有人可以糾正我嗎? 我希望它返回True或False,具體取決於子字符串是否出現'n'或更多次!通過字符串查找子串

def nCount(s,substr,n): 
    count = 0 
    for i in s: 
     if len(s[s.index(i):]) >= len(substr): 
      print s[s.index(i):(s.index(i)+(len(substr)))] 
      if (s[s.index(i):(s.index(i)+(len(substr)))] == substr): 

       count += 1 
    if (count >= n): 
     return True 
    return False 

print nCount("Mississippi", "si", 3) 
+0

請更正您的文章,我無法正常閱讀。 請詳細說明您想要獲得的代碼.. –

+3

「翻出」?你能更具體一點嗎?不要期望每個人都能打開IDE並測試你的代碼。 – Blorgbeard

+1

我猜這是一個類的任務,你必須從頭開始構建所有東西,但如果沒有......你意識到['s.count(substr)'](http://docs.python.org/2/library /stdtypes.html#str.count)可以代替整個循環,你有很多麻煩編寫,對吧? – abarnert

回答

0

很多更加容易與正則表達式:

import re 

def nCount(s, subst, n): 
    return len(re.findall(subst, s))>=n 

print nCount("Mississippi", "si", 3) # False 
print nCount("Mississippi", "si", 2) # True 
+1

爲什麼使用正則表達式? 's.count(subst)'比'len(re.findall(subst,s))'更簡單,更易讀。另外,它會更快,並且適用於碰巧具有正則表達式特殊字符的模式,如此類推。 – abarnert

4

我看不到任何方式該算法纔有意義。 for i in s將循環遍歷"Mississippi"中的所有字母。 s.index(i)將返回每個這樣的信件的第一個索引。所以,那將是0,1,2,2,1,2,2,1,8,8,1。我無法想象你可以用這個做任何有用的事情。

當你需要索引和值時,而不是試圖從索引值(這是困難的或不可能的)或索引值(這很容易但很單調)中計算索引,只需使用enumerate即可。這就是它是:

for index, i in enumerate(s): 

然後到處都在做s.index(i),只需使用index


當然,這是微不足道的與字符串count的方法來解決。

def nCount(s, subst, n): 
    return s.count(substr) >= n