Cómo reemplazar las letras correctas en una cadena de python

La tarea es:

Su tarea es corregir los errores en el texto digitalizado. Solo tienes que manejar los siguientes errores:

  • S se malinterpreta como 5
  • O se malinterpreta como 0
  • I se malinterpreta como 1

Mi código:

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 

Sé que esta solución no funcionará para una palabra como:

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

¿Alguien tiene consejos sobre cómo hacer de esta una función más general que funcione para cada palabra?

No use elif , ya que solo hace una prueba si la anterior falló. Cámbielas todas a ordinario if y el código funcionará correctamente.

Pero como se menciona en los comentarios, no hay necesidad de ninguna de las pruebas. Si la letra no está en la cadena, replace() solo devolverá la cadena original, por lo que no hay daño.

 string = string.replace('5', 'S').replace('0', 'O').replace('1', 'I') 

Puedes usar str.replace directamente.

 def correct(string): return string.replace('5','S').replace('0','O').replace('1','I') 

¿Por qué no haces uso de str.maketrans y str.translate ?

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

Envuelto en una función:

 def correct(s): return s.translate(str.maketrans('501', 'SOI')) 

Aquí hay otro método usando la comprensión de lista:

 def correct(str_, replacements = {'5': 'S', '0': 'O', '1': 'I'}): return "".join(replacements.get(c, c) for c in str_) print(correct("51NGAP0RE")) #'SINGAPORE'