La mission est:

Votre tâche consiste à corriger les erreurs dans le texte numérisé. Vous n'avez qu'à gérer les erreurs suivantes:

  • S est mal interprété comme 5
  • O est mal interprété comme 0
  • Je suis mal interprété comme 1

Mon code:

def correct(string):
    for i in string:
        if '5' in string:
           string = string.replace('5','S') 
        elif '0' in string:
          string = string.replace('0','O')
        elif '1' in string:
            string = string.replace('1','I')
    return string 

Je sais que cette solution ne fonctionnera pas pour un mot comme:

Test.assert_equals(correct("51NGAP0RE"),"SINGAPORE");

Quelqu'un a-t-il des conseils pour en faire une fonction plus générale qui fonctionnera pour chaque mot?

2
Steve 13 avril 2018 à 18:46

4 réponses

Meilleure réponse

N'utilisez pas elif, car cela ne fait un test que si le précédent a échoué. Changez-les tous en if ordinaire et le code fonctionnera correctement.

Mais comme mentionné dans les commentaires, aucun test n'est nécessaire. Si la lettre n'est pas dans la chaîne, replace() renverra simplement la chaîne d'origine, donc il n'y a aucun mal.

string = string.replace('5', 'S').replace('0', 'O').replace('1', 'I')
2
Barmar 13 avril 2018 à 15:51

Pourquoi n'utilisez-vous pas str.maketrans et str.translate:

>>> "51NGAP0RE".translate(str.maketrans('501', 'SOI'))
'SINGAPORE'

Enveloppé dans une fonction:

def correct(s):
    return s.translate(str.maketrans('501', 'SOI'))
5
user3483203 13 avril 2018 à 19:21

Voici une autre méthode utilisant la compréhension de liste:

def correct(str_, replacements = {'5': 'S', '0': 'O', '1': 'I'}):
    return "".join(replacements.get(c, c) for c in str_)
print(correct("51NGAP0RE"))
#'SINGAPORE'
2
pault 13 avril 2018 à 16:04

Vous pouvez utiliser str.replace directement.

def correct(string):
    return string.replace('5','S').replace('0','O').replace('1','I')
5
Rakesh 13 avril 2018 à 15:51