Hola, hallamos la solución a lo que necesitas, deslízate y la encontrarás más abajo.
Solución:
str.maketrans
crea una tabla de traducción, que es una asignación de enteros o caracteres a enteros, cadenas o None
. Piense en ello como un diccionario donde el keys representar caracteres en la entrada string y los valores que asignan para representar caracteres en la salida string.
pasamos por el string para traducir y reemplazar todo lo que aparece como un key en el mapeo con cualquiera que sea su valor en el mapa, o eliminarlo si ese valor es None
.
Puede crear una tabla de traducción con uno, dos o tres argumentos (creo que esto puede ser lo que lo confunde). Con un argumento:
str.maketrans('a': 'b', 'c': None)
Le asigna a la función una asignación que sigue las reglas de las tablas de traducción y devuelve una tabla equivalente para esa asignación. Cosas que se asignan a None
son removidos
Con dos argumentos:
str.maketrans('abc', 'xyz')
Le das dos cuerdas. Cada personaje en la primera string es reemplazado por el carácter en ese índice en el segundo string. Asi que 'a'
mapas a 'x'
, 'b'
para 'y'
y 'c'
para 'z'
.
El que estás usando, con tres argumentos, funciona igual que dos argumentos, pero tiene un tercero string.
str.maketrans('abc', 'xyz', 'hij')
Esto es lo mismo que la versión de dos argumentos, excepto que los personajes de la tercera string se eliminan, como si estuvieran asignados a None
. Entonces su tabla dice “No reemplace nada, pero elimine los caracteres que aparecen en este string”.
De la documentación sobre str.maketrans
:
Si hay un tercer argumento, debe ser un stringcuyos caracteres se asignarán a
None
en el resultado.
Esto es lo que str.maketrans
está haciendo; está tomando cada elemento en el tercer argumento y creando un mapa (un diccionario de Python) que mapea cada valor ordinal de los caracteres en el string para None
:
>>> str.maketrans('', '', '0123456789')
48: None,
49: None,
50: None,
51: None,
52: None,
53: None,
54: None,
55: None,
56: None,
57: None
Si existen valores extra como el primer y segundo argumento, se agregan a esta asignación como caracteres adicionales para traducir (es por eso que el autor seleccionó ''
y ''
; no quiere que se traduzcan caracteres adicionales):
>>> str.maketrans('a', 'A', '0123456789')
48: None,
49: None,
50: None,
51: None,
52: None,
53: None,
54: None,
55: None,
56: None,
57: None,
97: 65 # map ord('a') to ord('A')
Si aplicas esto a tu string ahora, también capitalizará 'athens'
para 'Athens'
debido al adicional 'a', 'A'
hemos proporcionado a maketrans
. No es la mejor de las traducciones, pero es suficiente para captar la funcionalidad.
str_obj.translate
luego realizará búsquedas en este diccionario para cada carácter en str_obj
reemplazando sus valores con los encontrados en el mapeo. Si no lo encuentra dentro del mapeo, lo deja como está, si es None
lo elimina. Esto se indica en la documentación para str.translate
:
Cuando está indexado por un ordinal Unicode (un número entero), el objeto de tabla puede realizar cualquiera de las siguientes acciones: devolver un ordinal Unicode o un stringpara asignar el carácter a uno o más caracteres; devolver
None
para borrar el caracter del retorno string; o levantar unLookupError
excepción, para mapear el carácter a sí mismo.
(Énfasis mío)
Acuérdate de que tienes permiso de explicar tu experiencia si diste con el arreglo.