鱼C论坛

 找回密码
 立即注册
查看: 100|回复: 8

[已解决]统计长度为 2 的字符串出现的次数

[复制链接]
发表于 2021-6-10 21:15:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
题:编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。
  1. def findstr(x,y):
  2.     count = 0
  3.     for each in y:
  4.         if each == x[0]:
  5.             index0 = y.index(each)
  6.             if y[index0+1] == x[1]:
  7.                 count += 1
  8.     print('The string you want to search for appears',count,'times.',end='')
  9. x = input('Please input the string you want to search for(length=2):')
  10. y = input('Please input the string you want to search from:')
  11. findstr(x,y)
复制代码

这是我的代码,然后我随便检测了一个:
  1. Please input the string you want to search for(length=2):lo
  2. Please input the string you want to search from:love is a long travel
  3. The string you want to search for appears 3 times.
复制代码

我怎么看也是两次而不是三次呀,但是就是不知道代码错哪了,因为有的例子做出来是对的。求大佬解答!!
(忽略塑料英语)
最佳答案
2021-6-10 22:12:58


你用 index,查找字符串,而 index 每次查找字符串都是将从左到右第一次遇到的字符串索引值返回

所以这里你每次循环 index0 的值都为固定值,而当你 for each in y 循环到最后时,即最后的字符 'l' 时,因为 index0 始终为第一个遇到字符的索引值,则始终返回 0

所以 if y[0+1] == x[1]: 又恰好导致条件成立所以把最后的 l 也计算入查找到的次数中了

你可以用个临时变量来记录索引值,或者像甲鱼哥答案 for 循环 range 字符长度,直接循环索引值,且调用 find 函数,配合切片达到目的

两者皆可,这里不用 index 是因为 index 若没有查找到,会导致程序报错,所以用 find ,若没查找到会返回 -1

临时变量的参考代码:

  1. def findstr(x,y):
  2.     count = 0
  3.     index_ = 0
  4.     for each in y:
  5.         index_ += 1
  6.         if each == x[0]:
  7.             if y[index_:index_+1] == x[1]:
  8.                 count += 1

  9.     print('The string you want to search for appears',count,'times.',end='')
  10. x = input('Please input the string you want to search for(length=2):')
  11. y = input('Please input the string you want to search from:')
  12. findstr(x,y)
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-10 21:21:25 | 显示全部楼层
因为你的x[0]='l',自然结果就是输出3次啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-10 21:57:36 | 显示全部楼层
你这个for循环中将所有字母都单独分开进入循环,那么each[0]就是字母本身,而each[1]则超出范围,那么现在判断的是x[0],也就是l字母,此时each中有三个l字母的字符串,那么就匹配中三次,返回的索引值三次都是0,因为是字母本身,继续执行代码,进入if y[index0+1] == x[1]中,此时代码判断的对象变成了y变量,此时的y变量还是没有分开,上面的index0的值都是0,那么三次判断的都是y[1],也就是o字母,同时y[0]和y[1]同时满足lo判断,那么返回的次数也就是3次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-10 21:58:10 | 显示全部楼层
你可以打印看index0的返回值,可以看到都是返回索引值0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-10 22:12:58 | 显示全部楼层    本楼为最佳答案   


你用 index,查找字符串,而 index 每次查找字符串都是将从左到右第一次遇到的字符串索引值返回

所以这里你每次循环 index0 的值都为固定值,而当你 for each in y 循环到最后时,即最后的字符 'l' 时,因为 index0 始终为第一个遇到字符的索引值,则始终返回 0

所以 if y[0+1] == x[1]: 又恰好导致条件成立所以把最后的 l 也计算入查找到的次数中了

你可以用个临时变量来记录索引值,或者像甲鱼哥答案 for 循环 range 字符长度,直接循环索引值,且调用 find 函数,配合切片达到目的

两者皆可,这里不用 index 是因为 index 若没有查找到,会导致程序报错,所以用 find ,若没查找到会返回 -1

临时变量的参考代码:

  1. def findstr(x,y):
  2.     count = 0
  3.     index_ = 0
  4.     for each in y:
  5.         index_ += 1
  6.         if each == x[0]:
  7.             if y[index_:index_+1] == x[1]:
  8.                 count += 1

  9.     print('The string you want to search for appears',count,'times.',end='')
  10. x = input('Please input the string you want to search for(length=2):')
  11. y = input('Please input the string you want to search from:')
  12. findstr(x,y)
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-10 22:33:11 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-6-10 22:34 编辑

问题出在:
  1. ...
  2. for each in y:
  3.      if each == x[0]:
  4.           index0 = y.index(each)  # 以x='lo'为例,这里返回的始终是 0,因为index()返回的是首个出现的索引数
  5.           if y[index0+1] == x[1]:   # 要搜索的字符串里共包含三个'l',但 y[index0+1]始终是第一个'l'后的'o',故重复累计了3次
  6.               count += 1
复制代码


解决办法(仅供参考):
  1. In [2]: "love is a long travel".count("lo")
  2. Out[2]: 2
复制代码

评分

参与人数 1鱼币 +2 收起 理由
wmy1212 + 2 哈哈这个方法真简便!!谢谢~~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-6-11 10:28:27 | 显示全部楼层
看了大家的回答,我的理解是我这个index0并不是如我所想定位每个each的位置,而是定位each那个字符第一次出现的下标,一直是0
谢谢大家!我再仔细研究下大家的答案修改~~~超级感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-6-11 10:43:04 | 显示全部楼层
Twilight6 发表于 2021-6-10 22:12
你用 index,查找字符串,而 index 每次查找字符串都是将从左到右第一次遇到的字符串索引值返回

所 ...

谢谢!我根据你的思路写了用临时变量的代码,但y[index_:index_+1]这个地方我写成了y[index_],也是可以的嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-11 10:47:50 | 显示全部楼层
wmy1212 发表于 2021-6-11 10:43
谢谢!我根据你的思路写了用临时变量的代码,但y这个地方我写成了y,也是可以的嘛?



这个会导致当你的 y 字符串第一个字符恰好和 x 的最后一个字符相等时,会导致列表超出索引值范围而报错

用切片超出索引范围就不会报错,当然你也可以另外设置个 if 来判断~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-6-24 21:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表