Ошибка значения таблицы перевода ValueError: строковые ключи в таблице перевода должны иметь длину 1 - PullRequest
0 голосов
/ 03 августа 2020
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import os, sys

test = input()
translation = {

    "hi":"jk" , "as":"bc" , "ca":"sa"
}

translated = test.maketrans(translation)
print(test.translate(translated))

Результат

Traceback (most recent call last):
  File "C:/Users/DELL/PycharmProjects/untitled1/Inpage.py", line 11, in <module>
    translated = test.maketrans(translation)
ValueError: string keys in translate table must be of length 1

Не обращайте внимания на импорт и комментарии c. Программа связана с utf-8 и не важна для этой текущей проблемы. У кого-нибудь есть обходной путь или способ исправить это, я буду счастлив. А в таблице 47 переводов.

1 Ответ

1 голос
/ 03 августа 2020

Запрещение ключей длиной больше 1 имеет свои намерения. Например, если у вас есть два ключа перевода - «ca» и «c», какой из них является приоритетным?

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

Затем вы можете реализовать следующее:

import re

def custom_make_translation(text, translation):
    regex = re.compile('|'.join(map(re.escape, translation)))
    return regex.sub(lambda match: translation[match.group(0)], text)

Обратите внимание, что с данной реализацией это

translation = {
    "hi":"jk", 
    "as":"bc", 
    "ca":"sa",
    "c": "oh no, this is not prioritized"
}

text = "hi this is as test ca"
translated = custom_make_translation(text, translation)

даст значение переведенного "jk tjks is bc test sa"

Но это будет иметь приоритет «c» над «ca», как это было раньше. в dict

translation = {
    "hi":"jk", 
    "as":"bc",
    "c": "i have priority",
    "ca":"sa"
}

text = "hi this is as test ca"
translated = custom_make_translation(text, translation)

даст значение переведенного "jk tjks is bc test i have prioritya"

, поэтому убедитесь, что вы используете его с осторожностью.

Кроме того, используя регулярное выражение, а не .replace in a for l oop гарантирует, что вы произведете все замены сразу. В противном случае, если у вас есть текст "a" и карта перевода: {"a": "ab", "ab": "abc"}, перевод будет "abc", а не "ab"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...