我正在进行Python任务,我被困在这里。
显然,我必须编写一个代码来计算字符串中给定子字符串的数量。
我以为我做对了,然后我被困在这里。
def count(substr,theStr):
# your code here
num = 0
i = 0
while substr in theStr[i:]:
i = i + theStr.find(substr)+1
num = num + 1
return num
substr = 'is'
theStr = 'mississipi'
print(count(substr,theStr))
如果我执行此操作,我希望得到 2 ,而不是 3 ......
请参阅,ana
和banana
等其他示例正常,但此具体示例仍然会出错。我不知道我在这里做错了什么。
请你帮帮我。
答案 0 :(得分:2)
在您的代码中
while substr in theStr[i:]:
正确地在目标字符串theStr
上前进,但是
i = i + theStr.find(substr)+1
始终从theStr
开始。
str.find
方法接受可选的 start 和 end 参数来限制搜索:
str.find(sub[, start[, end]])
返回找到substring sub 的字符串中的最低索引 在切片
s[start:end]
内。可选参数 start 和 end 被解释为切片表示法。如果找不到 sub ,则返回-1。
我们真的不需要在这里使用in
:我们可以检查find
是否不返回-1。当我们需要使用in
重复搜索以获取子字符串的索引时,执行find
搜索会有点浪费。
我假设您要查找重叠匹配,因为str.count
方法可以找到非重叠匹配,并且因为它在C中实现,所以比在Python中自己实现它更有效。
def count(substr, theStr):
num = i = 0
while True:
j = theStr.find(substr, i)
if j == -1:
break
num += 1
i = j + 1
return num
print(count('is', 'mississipi'))
print(count('ana', 'bananana'))
<强>输出强>
2
3
此代码的核心是
j = theStr.find(substr, i)
i
初始化为0,因此我们从theStr
的开头开始搜索,并且因为i = j + 1
后续搜索从最后找到的匹配后的索引开始查找。
答案 1 :(得分:0)
您需要的代码更改是 -
i = i + theStr[i:].find(substr)+ 1
而不是
i = i + theStr.find(substr)+ 1
在您的代码中,始终找到子字符串,直到i
到达位置4或更高位置。但是在找到子字符串的索引时,您使用的是原始(整个)字符串,而该字符串又将位置返回为1。
在banana
的示例中,首次迭代后i
变为2.因此,在下一次迭代中,str[i:]
变为nana
。并且此切片字符串中子字符串ana
的位置和原始字符串是1.因此,代码中的错误只是被抑制,代码似乎工作正常。
如果您的代码纯粹是出于学习目的,那么您可以这样做。否则,您可能希望使用python提供的函数(如count()
)来完成这项工作。
答案 2 :(得分:0)
计算子字符串的数量:
def count(substr,theStr): num = 0 for i in range(len(theStr)): if theStr[i:i+len(substr)] == substr: num += 1 return num substr = 'is' theStr = 'mississipi' print(count(substr,theStr))
O / P:2
其中theStr [i:i + len(substr)]是切片字符串,我是strating索引和 1 + LEN(SUBSTR) 正在结束索引
Eg. i = 0 substr length = 2 first-time compare substring is => mi String slice more details : https://docs.python.org/3/library/functions.html#slice