Le but est de renvoyer True si le nombre de fois où la sous-chaîne "cat" apparaît dans str est égal au nombre de fois où la sous-chaîne "dog" apparaît dans str.

J'ai déjà résolu cela en utilisant le str.count(sub) method intégré, mais maintenant je dois utiliser 1 boucle. Ce n'est pas un problème de devoirs, juste pour ma propre pratique.

Les cas de test qui ne fonctionnent pas:

cat_dog('catxxdogxxxdog') --> True (should return False)
cat_dog('catxdogxdogxca') --> True (should return False)
cat_dog('dogdogcat') --> True (should return False)

Je vous remercie!

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
-2
Mythic-ctrl 3 juin 2020 à 22:36

3 réponses

Meilleure réponse

Tout d'abord, c'est beaucoup de code pour ce que vous voulez faire. Par exemple, str.count(substr) ferait votre travail.
Mais puisque vous voulez le faire SANS cela, j'ai écrit du code à la fin.

Deuxièmement, le code renvoie False pour tous les cas de test (comme il se doit).

Voici une meilleure version du code que vous souhaitez (avec quelques suggestions de code dans les commentaires):

# Have an indentation of 4 SPACES for Python
#  
# `str` is a bad identifier name (as its a built-in class)
# So try using similar variables which are NOT reserved by Python
# 
# Also, write some documentation for what the function does right
# after the `:` function definition (in three quotes, for multi-line docstrings)
# (These can be read by using the built-in helper function `help(cat_dog)`
def cat_dog(text=''):
    """Returns True if *text* has equal no. of 'dog' and 'cat' substrings
else returns False"""

    # Since words are surrounded by other words and empty characters
    # we subtract 1 from the total
    dog_count = len(text.split('dog')) - 1
    cat_count = len(text.split('cat')) - 1

    if dog_count == cat_count:
        return True

    return False

Voici une autre version, similaire à la première, juste d'une manière différente:

import re

def cat_dog(text=''):
    """same documentation"""

    dog_count = len(re.findall('dog', text))
    cat_count = len(re.findall('cat', text))

    if dog_count == cat_count:
        return True

    return False
0
SFM61319 3 juin 2020 à 20:00

Votre boucle for n'est pas conçue pour faire ce à quoi elle est destinée. Chaque fois qu'il fait une boucle, il constate que chacune des sous-chaînes est en fait dans la chaîne, donc il incrémente chaque compte, vous ne gérez jamais de toute façon supprimer cette occurrence ou passer à l'occurrence suivante de cette sous-chaîne dans les itérations futures de la boucle.

Cela étant dit, je recommanderais simplement d'utiliser la fonction intégrée count pour vous faire gagner beaucoup de temps.

def cat_dog(str):
  return str.count("cat") == str.count("dog")

Ou si vous voulez toujours le faire à la main sans trop de complexité, pourrais-je recommander quelque chose comme:

def cat_dog(str):
    count1 = 0
    count2 = 0
    sub1 = 'cat'
    sub2 = 'dog'
    index = 0

    while sub1 in str[index:]:
        count1 += 1
        index = str[index:].find(sub1) + 1 +index

    index = 0

    while sub2 in str[index:]:
        count2 += 1
        index = str[index:].find(sub2) + 1 +index

    return count1 == count2
0
Jacob 3 juin 2020 à 20:04

Votre problème concerne ce segment de code:

for sub in a:
  if sub1 in str:
    count1 += 1
    if sub2 in str:
      count2 += 1
      if count1 == count2:
        return True
      else:
        return False

Ici, vous incrémentez count1 ou count2 de un si sub existe simplement dans str, cela ne dépend pas du nombre de fois que sub apparaît dans la chaîne. Par exemple, catxxdogxxxdog produit count1 = 2 et count2 = 2 puisque les nombres sont tous deux incrémentés une fois pour chaque élément dans a.

Si vous ne souhaitez pas utiliser str.count(sub), vous devrez parcourir vous-même str et compter le nombre de fois que chaque chaîne apparaît.

0
Dallan 3 juin 2020 à 19:53