codingbat python字符串计数

codingbat python字符串计数,python,string,Python,String,如果字符串“cat”和“dog”在给定字符串中出现的次数相同,则返回True 这是我正在尝试的问题。我的代码是: def cat_dog(str): count1 = 0 count2 = 0 if 'dog' and 'cat' not in str: return True for i in range(len(str)-1): if str[i:i+3] == 'cat': count1 +=

如果字符串“cat”和“dog”在给定字符串中出现的次数相同,则返回True

这是我正在尝试的问题。我的代码是:

def cat_dog(str):
    count1 = 0
    count2 = 0
   
    if 'dog' and 'cat' not in str:
        return True
    for i in range(len(str)-1):
        if str[i:i+3] == 'cat':
            count1 += 1
        if str[i:i+3] == 'dog':
            count2 += 1
    if count1 == count2:
        return True
    else:
        return False

我知道这是不正确的,因为代码似乎并没有在整个字符串中循环,也并没有收集猫和狗。不确定如何更正此问题。

只需使用
count
方法来计算字符串的出现次数

>>> 'catdog'.count('cat') == 'catdog'.count('dog')
True
>>> 'catdogdog'.count('cat') == 'catdogdog'.count('dog')
False
>>> 
您需要在此代码之前添加一个条件,否则,如果输入字符串上不存在
cat
dog
,则上述代码应返回
true

if 'dog' in string or 'cat' in string:
    return string.count('cat') == string.count('dog')
这和你想象的不一样。Python对此的解释如下:

if ('dog') and ('cat' not in str):
if 'dog' not in str and 'cat' not in str:
第一部分总是正确的,因为
'dog'
是一个非空字符串,所以它归结为
'cat'不在str
中。因此,您实际上只是检查字符串是否不包含
'cat'

你想要这样的东西:

if ('dog') and ('cat' not in str):
if 'dog' not in str and 'cat' not in str:
或者,相当于:

if not ('dog' in str or 'cat' in str):
或者,如果您有更多的测试要做,这比几个更紧凑:

if not any(x in str for x in ('cat', 'dog', 'mouse', 'beaver')):
这将影响函数是否到达循环,因此它可能会使您感到厌烦


另外,不要将变量命名为
str
str
是一种内置类型,您可能需要使用它,但无法使用,因为您已重新分配了它。

从函数返回的部分不应位于
for
循环内。这就是循环过早退出的原因

def cat_dog(str):
    count1 = 0
    count2 = 0

    if 'dog' not in str and 'cat' not in str: # <= kindall pointed this out
        return True

    for i in range(len(str)-1):
        if str[i:i+3] == 'cat':
            count1 += 1
        if str[i:i+3] == 'dog':
            count2 += 1

    if count1 == count2:  # <= These shouldn't be part of the for loop
        return True
    else:
        return False

你的代码只有2分钟的错误。一旦纠正,它将提供完美的结果,而无需任何进一步的更改。检查下面

第8行中的Edit1:
它需要的不是“范围内的i(len(str)-1)”,而是:“范围内的i(len(str)-2)”——因为单词cat和dog都是3个字母的单词,为了捕捉构成“cat”和“dog”的每个组合,我们需要从最后3个字母开始计数。因此,-2”而不是“-1”

第12、13、14、15行中的Edit2:
缩进不正确。它在值i的第一次迭代后立即比较count1和count2,因此返回错误的结果。只要正确的缩进,你的代码就是完美的

检查已更正的代码,无需我方的任何额外输入

def cat_dog(str):
    count1 = 0
    count2 = 0

    if 'dog' and 'cat' not in str:
        return True
    for i in range(len(str)-2):
        if str[i:i+3] == 'cat':
            count1 += 1
        if str[i:i+3] == 'dog':
            count2 += 1
    if count1 == count2:
        return True
    else:
        return False
这可能会起作用:

def cat_dog(str):
  counter_cat = 0
  counter_dog = 0
  for i in range(0, len(str)-2):
    if str[i] == 'c' and str[i+1] == 'a' and str[i+2] == 't':
      counter_cat += 1
    elif str[i] == 'd' and str[i+1] == 'o' and str[i+2] == 'g':
      counter_dog += 1
  return counter_cat == counter_dog

count
不计算OP代码将要进行的重叠匹配-例如
banana.count(“ana”)==1
。并不是说这对“猫”和“狗”有区别是的。codingbat使用str作为变量名,所以您不得不使用它。谢谢你的建议。我不会用str作为变量名,因为它是一个类名,所以你不能在函数中使用这个类。如果str中没有“dog”和“cat”,我会使用
string
str.
请参阅。请向OP解释他们的代码有什么问题,而不仅仅是发布一个工作版本。
    def cat_dog(str):

       cat = dog = 0
  
       for i in range(len(str)-2):
          if str[i:i+3] == "cat":
             cat += 1
          if str[i:i+3] == "dog":
             dog += 1
       return cat == dog
def cat_dog(str):
  counter_cat = 0
  counter_dog = 0
  for i in range(0, len(str)-2):
    if str[i] == 'c' and str[i+1] == 'a' and str[i+2] == 't':
      counter_cat += 1
    elif str[i] == 'd' and str[i+1] == 'o' and str[i+2] == 'g':
      counter_dog += 1
  return counter_cat == counter_dog