我正在努力教自己基础编程.
一个简单的项目是查找字符串中子字符串的重复索引.所以例如,在字符串“abcdefdef”和子串“def”中,我希望输出为3和6.我有一些代码写,但我没有得到我想要的答案.以下是我写的
注意:我知道可能有更简单的方法来生成结果,利用该语言的内置功能/包,例如正则表达式.我也知道我的方法可能不是最佳算法.从来没有,在这个时候,我只是在寻求修复以下逻辑的建议,而不是使用更多惯用的方法.
import string
def MIT(String, substring): # "String" is the main string I'm searching within
String_list = list(String)
substring_list = list(substring)
i = 0
j = 0
counter = 0
results = []
while i < (len(String)-1):
if [j] == [i]:
j = j + 1
i = i + 1
counter = counter + 1
if counter == len(substring):
results.append([i - len(substring)+1])
counter = 0
j = 0
i = i+1
else:
counter = 0
j = 0
i = i+1
print results
return
我的推理是这样的.我将String和子字符串转换为列表.这允许索引字符串中的每个字母.我设置i和j = 0 – 这些将分别是我在String和substring索引中的第一个值.我还有一个新的变量counter,我将其设置为0.基本上,我使用计数器来计算位置[i]中的字母等于位置[j]中的元素的次数.如果counter等于substring的长度,那么我知道[i-len(substring)1]是我的子串开始的位置,所以我将它添加到名为results的列表中.然后我重置计数器和j并继续搜索更多的子串.
我知道代码很尴尬,但我认为我仍然可以得到答案.相反,我得到:
>>> MIT("abcdefghi", "def")
[[3]]
>>> MIT("abcdefghi", "efg")
[[3]]
>>> MIT("abcdefghi", "b")
[[1]]
>>> MIT("abcdefghi", "k")
[[1]]
有什么想法吗?
解决方法:
正则表达式模块(re)更适合此任务.
好参考:
http://docs.python.org/howto/regex.html
也:
http://docs.python.org/library/re.html
编辑:
更“手动”的方式可能是使用切片
s = len(String)
l = len(substring)
for i in range(s-l+1):
if String[i:i+l] == substring:
pass #add to results or whatever