2013-10-30 221 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