Python 如果子字符串的数量彼此不相等,那么为什么我的代码返回True而应该返回False?

Python 如果子字符串的数量彼此不相等,那么为什么我的代码返回True而应该返回False?,python,for-loop,count,substring,Python,For Loop,Count,Substring,如果子字符串“cat”出现在str中的次数等于子字符串“dog”出现在str中的次数,则目标是返回True 我已经使用内置的str.count(sub)方法解决了这个问题,但是现在我必须使用1个循环。这不是家庭作业问题,只是为了我自己的练习 不起作用的测试用例: cat_dog('catxxdogxxxdog') --> True (should return False) cat_dog('catxdogxdogxca') --> True (should return False

如果子字符串“cat”出现在str中的次数等于子字符串“dog”出现在str中的次数,则目标是返回True

我已经使用内置的
str.count(sub)方法解决了这个问题,但是现在我必须使用1个循环。这不是家庭作业问题,只是为了我自己的练习

不起作用的测试用例:

cat_dog('catxxdogxxxdog') --> True (should return False)
cat_dog('catxdogxdogxca') --> True (should return False)
cat_dog('dogdogcat') --> True (should return False)
谢谢大家!

def cat_dog(str):
  count1 = 0
  count2 = 0
  sub1 = 'cat'
  sub2 = 'dog'
  a = [sub1, sub2]
  if sub1 not in str and sub2 not in str:
    return True
  elif sub1 in str and sub2 not in str:
    return False
  elif str == '':
    return True
  for sub in a:
    if sub1 in str:
      count1 += 1
      if sub2 in str:
        count2 += 1
        if count1 == count2:
          return True
        else:
          return False
  else:
    return False

您的问题与此代码段有关:

for sub in a:
  if sub1 in str:
    count1 += 1
    if sub2 in str:
      count2 += 1
      if count1 == count2:
        return True
      else:
        return False
这里,如果
sub
仅存在于
str
中,则将
count1
count2
增加1,这并不取决于
sub
在字符串中出现的次数。例如,
catxxdogxxxdog
产生
count1=2
count2=2
,因为
a
中的每个项目的计数都增加一次

如果您不想使用
str.count(sub)
,您需要自己迭代
str
,并计算每个字符串出现的次数。

首先,您要做的事情有很多代码。比如,
str.count(substr)
将完成您的工作。
但是,由于您希望在不使用它的情况下执行,因此我在最后编写了一些代码

其次,对于所有测试用例,代码都返回
False
(应该如此)

在这里,这是您想要的代码的更好版本(注释中有一些代码建议):

#Python的缩进为4个空格
#  
#`str`是一个错误的标识符名称(因为它是一个内置类)
#因此,请尝试使用Python没有保留的类似变量
# 
#另外,编写一些文档说明函数的正确功能
#在`:`函数定义之后(对于多行docstring,在三个引号中)
#(可使用内置的帮助功能“帮助”(cat_dog)读取这些信息)`
def猫狗(文本=“”):
"""
如果*text*具有相同数量的“dog”和“cat”子字符串,则返回True
否则返回False
"""
#因为单词被其他单词和空字符包围
#我们从总数中减去1
dog_count=len(text.split('dog'))-1
cat_count=len(text.split('cat'))-1
返回狗计数==猫计数
这是另一个版本,与第一个版本类似,只是方式不同:

重新导入
def猫狗(文本=“”):
"""
同样的文件
"""
dog_count=len(关于findall('dog',text))
类别计数=len(关于findall(“类别”,文本))
返回狗计数==猫计数

您的for循环并不是按照它的意图构建的。每次它循环时,它都会发现每个子字符串实际上都在字符串中,因此它会增加每个计数,您永远不会处理在循环的未来迭代中剥离该次出现或移动到该子字符串的下一次出现

话虽如此,我还是建议您只需使用内置的
count
函数即可节省大量时间

def猫狗(str):
返回str.count(“猫”)==str.count(“狗”)
或者,如果您仍然希望手工操作而不太复杂,我可以推荐如下内容:

def猫狗(str):
count1=0
count2=0
sub1=‘cat’
sub2=‘狗’
索引=0
而str[index:]中的sub1:
count1+=1
index=str[index:]查找(sub1)+1+索引
索引=0
而str[index:]中的sub2:
count2+=1
index=str[index:]查找(sub2)+1+索引
返回count1==count2

如果sub2
应该与
如果sub1
处于同一级别,并且
如果count
应该与
处于
级别
是否使用调试器查看在这些情况下返回
True
的原因?没有。即使调整缩进也无法修复它。如果您不知道它失败的原因,您希望如何修复它?