Что означает "таблица" в функции string.translate?

Выполняя функцию string.translate, в которой говорится:

Удалите все символы из s, которые находятся в файлах удаления (если они есть), а затем переведите символы с помощью таблицы, которая должна быть 256-символьной строкой, дающей перевод для каждого символьного значения, индексированный его порядковым номером. Если таблица None, то выполняется только шаг удаления символов.

  • Что здесь означает таблица? Может ли это быть dict, содержащее отображение?
  • Что означает "должна быть строка с 256 символами" означает?
  • Может ли таблица быть сделана вручную или через пользовательскую функцию вместо string.maketrans?

Я попытался использовать функцию (попытки ниже), чтобы увидеть, как она работает, но не смогла ее использовать.

>>> "abcabc".translate("abcabc",{ord("a"): "d", ord("c"): "x"})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
TypeError: expected a character buffer object

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

Что мне здесь не хватает?

Ответ 1

Это зависит от используемой версии Python.

В Python 2.x. Таблица содержит 256 символов. Его можно создать с помощью string.maketrans:

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

В Python 3.x таблица отображает ординалы юникода на символы юникода.

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

Ответ 2

table должна содержать строку из 256 символов; метод str.translate() использует эту таблицу для сопоставления значения байта (число от 0 до 255) до нового символа; например любой символ 'a' (байт с целым числом 97) заменяется на 98-й символ в таблице.

Вы действительно хотите обратиться к str.translate() документации для всего этого, а не к функции string.translate(); последняя документация не такая полная.

Вы можете создать один, используя string.maketrans; вы даете ему только символы, которые вы хотите заменить, с символами, которые их заменяют; для вашего примера:

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

Второй аргумент также должен быть строкой.

Кажется, вы прочитали документацию для метода unicode.translate(); поведение изменилось, и вам действительно нужно перейти в словарь для unicode.translate(). Поскольку тип Python 2 unicode является типом str в Python 3, это также означает, что вы используете str.translate() в Python 3 (где bytes.translate() соответствует описанному выше поведению).

Ответ 3

Чтобы перевести текст, не используя словарь {порядковый номер: char}, но словарь {char: char} (например, {'a': 'X', 'J': 'y',...}:

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