Нет, аргументы не одинаковой длины:
>>> len("0123456789")
10
>>> len("₀₁₂₃₄₅₆₇₈₉")
30
Вы пытаетесь передать закодированные данные; Здесь я использовал UTF-8, где каждая цифра кодируется по 3 байта.
Вы не можете использовать str.translate()
для сопоставления байтов ASCII с последовательностями байтов UTF-8. Декодируйте вашу строку в unicode
и используйте немного другой метод unicode.translate()
; вместо этого используется словарь:
nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")}
Это создает словарь, отображающий кодовые точки Unicode (целые числа), которые затем можно использовать в строке Unicode:
>>> nummap = {ord(c): ord(t) for c, t in zip(u"0123456789", u"₀₁₂₃₄₅₆₇₈₉")}
>>> u'99 bottles of beer on the wall'.translate(nummap)
u'\u2089\u2089 bottles of beer on the wall'
>>> print u'99 bottles of beer on the wall'.translate(nummap)
₉₉ bottles of beer on the wall
Затем вы можете снова закодировать вывод в UTF-8, если хотите.
Из документации по методу:
Для объектов Unicode метод translate()
не принимает необязательный аргумент deletechars. Вместо этого он возвращает копию s, в которой все символы были сопоставлены через данную таблицу перевода, которая должна быть сопоставлением порядковых номеров Unicode с порядковыми номерами Unicode, строками Unicode или None
. Несопоставленные символы остаются нетронутыми. Символы, сопоставленные с None
, удаляются.
person
Martijn Pieters
schedule
07.05.2015