2016-03-27 1 views
2

Je souhaite remplacer les caractères d'une chaîne par des minuscules. Ci-dessous mon code, ma sortie réelle est "a": pourriez-vous s'il vous plaît dites-moi où je me trompe et expliquez-moi pourquoi? Merci à l'avancePython: Alterner les majuscules et les minuscules dans une chaîne

test = "AltERNating" 

def to_alternating_case(string): 
    words = list(string) 
    for word in words: 
     if word.isupper() == True: 
      return word.lower() 
     else: 
      return word.upper() 

print to_alternating_case(test) 
+0

La raison pour laquelle votre code ne fonctionne pas est que « retour "laissera la fonction en cours ('to_alternating_case()'). Si vous voulez implémenter .swapcase() à des fins éducatives - faites muter la liste "words" au lieu de retourner au premier caractère. – folkol

Répondre

8

Il semble que votre besoin d'inverser le cas de cette chaîne, essayez ceci:

>>> 'AltERNating'.swapcase() 
'aLTernATING' 
1

C'est parce que votre fonction retourne le premier caractère uniquement. Je veux dire return mot-clé casse votre boucle for.

Notez également qu'il est inutile de convertir la chaîne en une liste en exécutant words = list(string) car you can iterate over a string comme vous l'avez fait avec la liste.

Si vous êtes à la recherche d'une solution algorithmique au lieu de la swapcase() puis modifiez votre méthode ainsi à la place:

test = "AltERNating" 

def to_alternating_case(string): 
    res = "" 
    for word in string: 
     if word.isupper() == True: 
      res = res + word.lower() 
     else: 
      res = res + word.upper() 
    return res 


print to_alternating_case(test) 
1

Votre itère boucle sur les caractères de la chaîne d'entrée. Il revient ensuite dès la première itération. Ainsi, vous obtenez toujours une valeur de retour de 1-char.

test = "AltERNating" 

def to_alternating_case(string): 
    words = list(string) 
    rval = '' 
    for c in words: 
     if word.isupper(): 
      rval += c.lower() 
     else: 
      rval += c.upper() 
    return rval  

print to_alternating_case(test) 
1

Vous devriez faire comme ceci:

test = "AltERNating" 

def to_alternating_case(string): 
    words = list(string) 
    newstring="" 
     if word.isupper() == True: 
      newstring+=word.lower() 
     else: 
      newstring+=word.upper() 
    return alternative 
print to_alternating_case(test) 
3

Il y a deux réponses à cette : un facile et un dur.

La facilité un

Python a une fonction intégrée pour le faire, je ne me rappelle pas exactement ce qu'il est, mais quelque chose le long des lignes de

string.swapcase() 

Le disque un

Vous définissez votre propre fonction. La façon dont vous avez fait votre fonction est fausse, parce que itérer sur une chaîne la renverra lettre par lettre, et vous renvoyez simplement la première lettre au lieu de continuer l'itération.

def to_alternating_case(string): 
    temp = "" 
    for character in string: 
     if character.isupper() == True: 
      temp += character.lower() 
     else: 
      temp += word.upper() 
    return temp 
1

vous retournez le premier alphabet après une boucle sur l'alternance de mot qui est pas ce que vous attendez, il y a une suggestion que vous pouvez boucle directement sur la chaîne en python plutôt que de les convertir à la liste et d'expression si < nom-variable > == True peut être directement simplifié si < nom de variable >.Ans avec les modifications suivantes:

test = "AltERNating" 

def to_alternating_case(string): 
    result = '' 
    for word in string: 
     if word.isupper(): 
      result += word.lower() 
     else: 
      result += word.upper() 
    return result 

print to_alternating_case(test) 

OU en utilisant la compréhension de la liste:

def to_alternating_case(string): 
    result =[word.lower() if word.isupper() else word.upper() for word in string] 
    return ''.join(result) 

OU en utilisant la carte, lambda:

def to_alternating_case(string): 
    result = map(lambda word:word.lower() if word.isupper() else word.upper(), string) 
    return ''.join(result)