2014-07-07 5 views
0

J'ai copié le code suivant avec une altération dans le nommage pour résoudre le problème comme indiqué: Soit une chaîne s, retourne une chaîne où toutes les occurrences de son premier caractère ont été changées en '*', sauf ne changez pas le premier char lui-même. par exemple. "babiller" donne "ba ** le". Supposons que la chaîne est de longueur 1 ou plus. Voici le code: Ma question est quand je passe "Lulla" pourquoi je ne vois pas "Lu ** a" retourné dans l'interprète comme je pense que le code devrait faire.Sortie inattendue dans le programme python

def fix_start(s): 
    start_letter = s[0] 
    rest_letters = s[1:] 
    rest_letters = rest_letters.replace(start_letter,'*') 
    return start_letter + rest_letters 

print (fix_start ('Lulla')) 
+0

depuis que vous remplacez par C aptial L mais autres r petit l –

Répondre

0

Tout simplement tout ce qui est nécessaire est d'utiliser lower() ou upper() pour modifier la casse de la chaîne:

start_letter = s[0].lower() 
rest_letters = s[1:].lower() 

Entrée: Lulla
Sortie: lu ** un

+0

Je pense que c'est une interprétation étrange. Pour une raison quelconque, j'ai supposé que le cas de la première lettre ne devrait pas être changé dans la sortie. –

+0

@gnibbler, point valide; J'ai interprété la question/question comme comment faire correspondre le mot (indépendamment du cas). Le premier cas de caractère peut toujours être reculé après la correspondance pour conserver celui de l'original 'return s [0] + rest_letters'. –

1

Ce qui se passe est que Python est sensible à la casse . En d'autres termes:

'L' != 'l' 

Alors, quand vous faites

rest_letters = rest_letters.replace(start_letter,'*') 

il remplacera toutes les occurences de seulement L, pas les deux L et l.

Que pouvez-vous faire? Le processus de remplacement insensible à la casse est assez complexe, comme vous pouvez le voir dans these answers. Mais dans votre cas, cela peut fonctionner:

rest_letters = rest_letters.replace(start_letter,'*').replace(start_letter.lower(), '*') 
+0

Qu'en est-il de '" luLLa "'? Vous devriez utiliser 'start_letter.upper()' pour couvrir cette possibilité –

0

Dans votre code, vous remplacez une instance de la première lettre « L » dans le reste de la chaîne. Dans le cas de l'exemple "Lulla", la première lettre est une majuscule "L" et n'est pas égale à "l". En tant que tel, je les opérations suivantes:

def fix_start(s): 
    start_letter = s[0] 
    rest_letters = s[1:] 
    rest_letters = rest_letters.replace(start_letter.lower(),'*') 
    return start_letter + rest_letters 

La solution ci-dessus fonctionnera si vous avez des chaînes qui sont garantis pour être syntaxiquement correct (comme dans aucune lettre majuscule au milieu du mot).

Si ce n'est pas garanti, allez-y et essayez ceci:

def fix_start(s): 
    start_letter = s[0] 
    rest_letters = s[1:] 
    rest_letters = rest_letters.replace(start_letter.lower(),'*') 
    rest_letters = rest_letters.replace(start_letter, '*') 
    return start_letter + rest_letters 
0

En fait, vous essayez de remplacer L mais reste des personnages sont petits l .Essayez en utilisant l'expression régulière qui rend cette tâche facile.

import re 
def fix_start(s): 
    start_letter = s[0] 
    regex = s[0].lower()+"|"+s[0].upper() 
    rest_letters = s[1:] 
    rest_letters = re.sub(regex, "*", rest_letters) 
    return start_letter + rest_letters 

print (fix_start ('Lulla'))