统计长度为 2 的字符串出现的次数
题:编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。def findstr(x,y):
count = 0
for each in y:
if each == x:
index0 = y.index(each)
if y == x:
count += 1
print('The string you want to search for appears',count,'times.',end='')
x = input('Please input the string you want to search for(length=2):')
y = input('Please input the string you want to search from:')
findstr(x,y)
这是我的代码,然后我随便检测了一个:
Please input the string you want to search for(length=2):lo
Please input the string you want to search from:love is a long travel
The string you want to search for appears 3 times.
我怎么看也是两次而不是三次呀,但是就是不知道代码错哪了,因为有的例子做出来是对的。求大佬解答!!
(忽略塑料英语) 因为你的x='l',自然结果就是输出3次啊 你这个for循环中将所有字母都单独分开进入循环,那么each就是字母本身,而each则超出范围,那么现在判断的是x,也就是l字母,此时each中有三个l字母的字符串,那么就匹配中三次,返回的索引值三次都是0,因为是字母本身,继续执行代码,进入if y == x中,此时代码判断的对象变成了y变量,此时的y变量还是没有分开,上面的index0的值都是0,那么三次判断的都是y,也就是o字母,同时y和y同时满足lo判断,那么返回的次数也就是3次{:10_277:} 你可以打印看index0的返回值,可以看到都是返回索引值0
你用 index,查找字符串,而 index 每次查找字符串都是将从左到右第一次遇到的字符串索引值返回
所以这里你每次循环 index0 的值都为固定值,而当你 for each in y 循环到最后时,即最后的字符 'l' 时,因为 index0 始终为第一个遇到字符的索引值,则始终返回 0
所以 if y == x: 又恰好导致条件成立所以把最后的 l 也计算入查找到的次数中了
你可以用个临时变量来记录索引值,或者像甲鱼哥答案 for 循环 range 字符长度,直接循环索引值,且调用 find 函数,配合切片达到目的
两者皆可,这里不用 index 是因为 index 若没有查找到,会导致程序报错,所以用 find ,若没查找到会返回 -1
临时变量的参考代码:
def findstr(x,y):
count = 0
index_ = 0
for each in y:
index_ += 1
if each == x:
if y == x:
count += 1
print('The string you want to search for appears',count,'times.',end='')
x = input('Please input the string you want to search for(length=2):')
y = input('Please input the string you want to search from:')
findstr(x,y)
本帖最后由 阿奇_o 于 2021-6-10 22:34 编辑
问题出在:
...
for each in y:
if each == x:
index0 = y.index(each)# 以x='lo'为例,这里返回的始终是 0,因为index()返回的是首个出现的索引数
if y == x: # 要搜索的字符串里共包含三个'l',但 y始终是第一个'l'后的'o',故重复累计了3次
count += 1
解决办法(仅供参考):
In : "love is a long travel".count("lo")
Out: 2 看了大家的回答,我的理解是我这个index0并不是如我所想定位每个each的位置,而是定位each那个字符第一次出现的下标,一直是0{:10_266:}
谢谢大家!我再仔细研究下大家的答案修改~~~超级感谢! Twilight6 发表于 2021-6-10 22:12
你用 index,查找字符串,而 index 每次查找字符串都是将从左到右第一次遇到的字符串索引值返回
所 ...
谢谢!我根据你的思路写了用临时变量的代码,但y这个地方我写成了y,也是可以的嘛? wmy1212 发表于 2021-6-11 10:43
谢谢!我根据你的思路写了用临时变量的代码,但y这个地方我写成了y,也是可以的嘛?
这个会导致当你的 y 字符串第一个字符恰好和 x 的最后一个字符相等时,会导致列表超出索引值范围而报错
用切片超出索引范围就不会报错,当然你也可以另外设置个 if 来判断~
页:
[1]