¿Qué significa “tabla” en la función string.translate?

Pasando a través de la función string.translate que dice:

Elimine todos los caracteres de s que estén en barras de deleción (si están presentes), y luego traduzca los caracteres utilizando la tabla, que debe ser una cadena de 256 caracteres que proporcione la traducción para cada valor de carácter, indexada por su ordinal. Si la tabla es Ninguna, solo se realiza el paso de eliminación de caracteres.

  • ¿Qué significa mesa aquí? ¿Puede ser un dict contiene el mapeo?
  • ¿Qué significa “debe ser una cadena de 256 caracteres” ?
  • ¿Se puede hacer la tabla manualmente o mediante una función personalizada en lugar de string.maketrans ?

Intenté usar la función (bashs a continuación) solo para ver cómo funcionaba, pero no pude usarla correctamente.

 >>> "abcabc".translate("abcabc",{ord("a"): "d", ord("c"): "x"}) Traceback (most recent call last): File "", line 1, in  ValueError: translation table must be 256 characters long 
 >>> "abcabc".translate({ord("a"): ord("d"), ord("c"): ord("x")}, "b") Traceback (most recent call last): File "", line 1, in  TypeError: expected a character buffer object 

 >>> "abc".translate({"a": "d", "c": "x"}, ["b"]) Traceback (most recent call last): File "", line 1, in  TypeError: expected a character buffer object 

¿Que me estoy perdiendo aqui?

Depende de la versión de Python que estés usando.

En Python 2.x. La tabla es una cadena de 256 caracteres. Se puede crear usando string.maketrans :

 >>> import string >>> tbl = string.maketrans('ac', 'dx') >>> "abcabc".translate(tbl) 'dbxdbx' 

En Python 3.x, la tabla está asignando los ordinales de Unicode a los caracteres de Unicode.

 >>> "abcabc".translate({ord('a'): 'd', ord('c'): 'x'}) 'dbxdbx' 

table debe ser una cadena de 256 caracteres; el método str.translate() utiliza esta tabla para asignar el valor del byte (un número entre 0 y 255) a un nuevo carácter; por ejemplo, cualquier carácter 'a' (un byte con el valor entero 97) se reemplaza con el carácter 98 en la tabla.

Realmente desea str.translate() documentación de str.translate() para todo esto, no la función string.translate() ; La última documentación no es tan completa.

Puedes construir uno usando la función string.maketrans ; le da solo los caracteres que desea reemplazar con los caracteres que los reemplazan; para tu ejemplo, eso es:

 >>> import string >>> table = string.maketrans('ac', 'cx') >>> len(table) 256 >>> table[97] 'c' >>> 'abcabc'.translate(table, 'b') 'cxcx' 

El segundo argumento también se supone que es una cadena.

Parece que has leído la documentación del método unicode.translate() ; el comportamiento cambió y, de hecho, tiene que pasar un diccionario para unicode.translate() . Como el tipo unicode Python 2 es el tipo str en Python 3, también es así como usaría str.translate() en Python 3 (donde bytes.translate() coincide con el comportamiento anterior).

Para traducir texto, no use un diccionario {ordinal: char}, sino un diccionario {char: char} (por ejemplo, {‘a’: ‘X’, ‘J’: ‘y’, …}:

 text.translate({ord(k):dictionary[k] for k in dictionary})