2017-04-21 1 views
0

J'ai besoin d'aide pour créer cette fonction python. Une fonction récursive count_upper_lower() qui prend une chaîne non vide comme argument et retourne un tuple contenant les comptes de combien de lettres dans la chaîne sont en majuscule et combien sont en minuscules (dans cet ordre). Par exemplecompter les lettres majuscules et minuscules en python en utilisant la récursivité

print (count_upper_lower(’Town Hall University’)) 

reviendriez

(3, 15) 

ce que j'ai jusqu'à présent

def count_upper_lower(word): 
    upper = 0 
    lower = 0 
    if word == "": 
     upper = 0 
     lower = 0 
     return upper, lower 
    elif word[0].isupper(): 
     upper = 1 + count_upper_lower(word[1:]) 
     return upper , lower 


    elif word[0].islower(): 
     lower = 1 + count_upper_lower(word[1:]) 
     return upper , lower 

    else: 
     upper = 0 + count_upper_lower(word[1:]) 
     lower = 0 + count_upper_lower(word[1:]) 
     return upper, lower 

Je reçois l'erreur suivante:

TypeError: unsupported operand type(s) for +: 'int' and 'tuple' 
+1

Indice: passez par l'appel de 'word ==" a "'. Qu'attendez-vous de "1 + (0, 0)"? – timgeb

Répondre

1

Comme il est indiqué, vous essayez d'ajouter ints à tuples, ce qui est la raison pour laquelle vous obtenez le message d'erreur. Considérez l'exemple suivant à la place:

def count_upper_lower(word): 
    if not word: 
     return 0, 0 
    else: 
     upper, lower = count_upper_lower(word[1:]) 
     if word[0].isupper(): 
      return upper+1, lower 
     elif word[0].islower(): 
      return upper, lower+1 
     else: 
      # make sure that this is what you want 
      return upper, lower 

Ici, la fonction s'appelle récursivement jusqu'à ce que la chaîne soit épuisée. L'autre cas attrape le cas où le caractère n'est ni un caractère supérieur ni un caractère inférieur (par exemple un chiffre), auquel cas aucun compteur n'est augmenté.

+0

Cela renvoie exactement ce dont j'avais besoin. Mon ajout de tuple n'était pas correct. Merci beaucoup :-) –

1

J'utiliserais une boucle et ascii. Dans la table ascii 65 jusqu'à 91 est une majuscule et 97 jusqu'à 123 est une minuscule.

def count_upper_lower(word): 
    upper = 0 
    lower = 0 
    for letter in word: #runs through all the letter if empty nothing happens 
     if 65 <= ord(letter) <= 90: 
      upper += 1 
     elif 97 <= ord(letter) <= 122: 
      lower += 1 
    return upper,lower 

Ceci est également possible.

def count_upper_lower(word): 
    upper = 0 
    lower = 0 
    for letter in word: #runs through all the letter if empty nothing happens 
     if letter.isupper(): 
      upper += 1 
     elif letter.islower(): 
      lower += 1 
    return upper,lower 
+0

était sur le point de poster une solution similaire, c'est la bonne approche. – chukkwagon

+2

Ce n'est pas récursif, et je pense que la suggestion d'OP d'utiliser les méthodes 'isupper' et' islower' est plus pythonique que d'utiliser les identifiants de caractères ASCII. –

+0

Merci, mais il doit être récursif –

0

Dans votre bloc else, vous essayez d'ajouter le tuple de retour de count_upper_lower() à un nombre.

class myCounter(): 
    def __init__(self): 
     self.lower = 0 
     self.upper = 0 

    def count(self, s): 
     if not s: 
      return (self.upper, self.lower) 

     firstCharacter = s[0] 

     if firstCharacter.islower(): 
      self.lower += 1 
     elif firstCharacter.isupper(): 
      self.upper += 1 
     else: 
      pass #do nothing ! 

     return self.count(s[1:]) 


c = myCounter() 
print(c.count("Town Hall University")) 
>>> (3, 15) 
0

Il y a un problème avec l'utilisation tuple car il est une structure de données immuables. list utilisé à la place.

def count_letters(phrase): 
    if phrase: 
     letter = phrase[0] 
     result = count_letters(phrase[1:]) 
     if letter.isupper(): 
      result[0] += 1 
     elif letter.islower(): 
      result[1] += 1 
     return result 
    else: 
     return [0, 0] 


>>> count_letters("LaLaa") 
[2, 3] 
+0

Merci cela fonctionne aussi bien qu'il renvoie une liste –

1

Si vous voulez le faire avec deux lignes de code:

lst = [1 if letter.islower() else 0 for letter in word if letter.islower() or letter.isupper()] 
print (lst.count(0),lst.count(1)) 
+0

Je défie tout le monde pour le faire en une ligne –

+0

Remplacez simplement lst par la compréhension de la liste dans la déclaration d'impression: D Stupide, mais 1 ligne – VeGABAU

+0

C'est en effet stupide, mais vous avez raison, c'est une ligne –