Что означает "таблица" в функции 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})